如何防止基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 等)。
我需要做:
我们可以做到:Animal* intAnimal = new IntAnimal(); int x = intAnimal->getValue();
我认为这是不可能的。
防止他人做:Animal* intAnimal = new IntAnimal();
如何防止他人执行 (2)?谢谢。
编辑:是的,这是一个糟糕的设计,我应该使用模板。但是,有没有其他方法可以解决这个问题呢?
你无事可做。
您当前的代码首先禁止其他人使用 new IntAnimal();
,因为构造函数是 private
.
即使你改变那个,你的条件仍然满足。由于 Animal
基类被继承为 private
,因此外部代码无法访问它并且隐式转换格式错误。
Animal* intAnimal = new IntAnimal();
不会编译。
在 class 和 friend
中,基础 class 和构造函数总是可以访问的,并且这种情况从来没有问题。
如果 Animal
被 IntAnimal
继承为 public
,则无法阻止从 IntAnimal*
到 Animal*
的隐式转换。
另请注意,继承 private
不会阻止代码显式转换为 Animal*
。任何外部代码都可以使用 C 风格转换
Animal* intAnimal = (Animal*) new IntAnimal();
这里的行为等同于隐式转换,不同之处在于它忽略了基础 class 的可访问性,并且会独立于 Animal
是否继承为 private
或public
.
我遇到了如下问题。
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 等)。
我需要做:
我们可以做到:
Animal* intAnimal = new IntAnimal(); int x = intAnimal->getValue();
我认为这是不可能的。防止他人做:
Animal* intAnimal = new IntAnimal();
如何防止他人执行 (2)?谢谢。
编辑:是的,这是一个糟糕的设计,我应该使用模板。但是,有没有其他方法可以解决这个问题呢?
你无事可做。
您当前的代码首先禁止其他人使用 new IntAnimal();
,因为构造函数是 private
.
即使你改变那个,你的条件仍然满足。由于 Animal
基类被继承为 private
,因此外部代码无法访问它并且隐式转换格式错误。
Animal* intAnimal = new IntAnimal();
不会编译。
在 class 和 friend
中,基础 class 和构造函数总是可以访问的,并且这种情况从来没有问题。
如果 Animal
被 IntAnimal
继承为 public
,则无法阻止从 IntAnimal*
到 Animal*
的隐式转换。
另请注意,继承 private
不会阻止代码显式转换为 Animal*
。任何外部代码都可以使用 C 风格转换
Animal* intAnimal = (Animal*) new IntAnimal();
这里的行为等同于隐式转换,不同之处在于它忽略了基础 class 的可访问性,并且会独立于 Animal
是否继承为 private
或public
.