如何防止基class 的指针指向派生class?

How to prevent a pointer of base class to point to derived class?

我遇到了如下问题。

class Animal
{
   void* value;
   public:
   Animal() {}
   void* getValue() {return value;} 
}

class IntAnimal : private Animal
{
  public:
  IntAnimal() {}
  int getValue() {return (*(int*)Animal::getValue());}
}

基本上是基础 class return void*,但是派生的 class return 是一个常规类型(int、double、char 等)。

我需要做:

  1. 我们可以做到:Animal* intAnimal = new IntAnimal(); int x = intAnimal->getValue();我认为这是不可能的。

  2. 防止他人做:Animal* intAnimal = new IntAnimal();

如何防止他人执行 (2)?谢谢。

编辑:是的,这是一个糟糕的设计,我应该使用模板。但是,有没有其他方法可以解决这个问题呢?

你无事可做。

您当前的代码首先禁止其他人使用 new IntAnimal();,因为构造函数是 private.

即使你改变那个,你的条件仍然满足。由于 Animal 基类被继承为 private,因此外部代码无法访问它并且隐式转换格式错误。

Animal* intAnimal = new IntAnimal();

不会编译。

在 class 和 friend 中,基础 class 和构造函数总是可以访问的,并且这种情况从来没有问题。


如果 AnimalIntAnimal 继承为 public,则无法阻止从 IntAnimal*Animal* 的隐式转换。


另请注意,继承 private 不会阻止代码显式转换为 Animal*。任何外部代码都可以使用 C 风格转换

Animal* intAnimal = (Animal*) new IntAnimal();

这里的行为等同于隐式转换,不同之处在于它忽略了基础 class 的可访问性,并且会独立于 Animal 是否继承为 privatepublic.