如何防止基类的指针指向派生类?
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());}
}
基本上基类返回 void*,但派生类返回常规类型(int、double、char 等(。
我需要做以下任一:
我们可以做:
Animal* intAnimal = new IntAnimal(); int x = intAnimal->getValue();
我认为这是不可能的。阻止他人执行以下操作:
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
继承,都将成功。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 如何使用基类指针引用派生类成员
- 将派生指针分配给C 中的其他派生类型
- 如何通过派生指针调用基类中的模板成员函数
- 如何将带有恒定指针作为参数的模板的派生指针使用
- 无法返回包含派生指针的向量
- 如何创建派生指针类变量
- C++强制转换为派生指针或设计错误
- 无法从派生指针访问公共基成员
- C++发送派生指针作为参数
- 将专用基指针强制转换为专用于其他模板参数的派生指针("adding on"专用化)
- 在派生指针上显式调用基类析构函数时编译错误
- 安全派生指针值的示例
- 安全派生指针的整数表示形式
- c++多态克隆:如何从基指针获得派生指针
- 如果我将派生指针转换为基指针,这两个指针是否保证具有相同的值?
- 以任何方式将基指针强制转换为派生指针是否危险
- 将派生指针隐式强制转换为其相应基类的引用
- 当派生指针仅添加方法时,将基指针强制转换为派生指针的有效性
- c++转换指针到派生指针到基指针的例子