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

问题描述 投票:1回答:1

我有以下类似问题。

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)?谢谢。

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

c++ inheritance stack void void-pointers
1个回答
2
投票

您无事可做。

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

即使您进行了更改,您的条件仍然得到满足。由于Animal基继承为private,因此外部代码和隐式强制转换格式均无法访问。

Animal* intAnimal = new IntAnimal();

不会编译。

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


[如果IntAnimal*Animal*继承为Animal,则无法防止从publicIntAnimal的隐式转换。


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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.