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

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

本文关键字:派生 指针 何防止 基类      更新时间:2023-10-16

我有以下看起来像这样的问题。

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

基本上基类返回 void*,但派生类返回常规类型(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();

不会编译。

在类和friend内部,基类和构造函数始终是可访问的,并且该条件永远不会有问题。


如果Animal隐式强制转换被IntAnimal继承为public,则不可能阻止隐式强制转换IntAnimal*Animal*


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

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

它在这里的行为等同于隐式强制转换,不同之处在于它忽略了基类的可访问性,并且无论Animal是作为private继承还是public继承,都将成功。