我有以下类似问题。
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
内部,始终可以访问基类和构造函数,并且该条件永远不会出现问题。
[如果IntAnimal*
被Animal*
继承为Animal
,则无法防止从public
到IntAnimal
的隐式转换。
还请注意,继承为private
不会阻止代码显式转换为Animal*
。任何外部代码都可以始终使用C样式强制转换
Animal* intAnimal = (Animal*) new IntAnimal();
这里的行为等效于隐式强制转换,区别在于它忽略了基类的可访问性,并且无论Animal
是继承为private
还是public
都将成功。