gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:07:44 25 4
gpt4 key购买 nike

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

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,则不可能阻止从 publicIntAnimal的隐式转换。

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

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

    关于c++ - 如何防止基类的指针指向派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59332071/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com