gpt4 book ai didi

C++ 在子类中创建一个可用的方法

转载 作者:行者123 更新时间:2023-11-27 22:59:58 25 4
gpt4 key购买 nike

这是我的基类

class Base {
protected:
int number;
public:
Base(int num);
virtual void display() = 0;
};

这两个类都继承了Base。

class Derived: public Base {
public:
Derived(int num);
void display(){cout <<"hello";}
void other();
};

class Derived2: public Base {
public:
Derived(int num);
void display(){cout <<"hello other";}
};

这个类允许我实例化我的两个类 Derived 和 Derived2

class Foo{
private:
Base * toto[2];
public:
Foo(){
toto[0] = new Derived;
toto[1] = new Derived2;
}

void doSomething();
}

我想做这个

void Foo::doSomething(){
toto[0]->other();
}

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$

最后一个问题我创建了一个继承了Derived2Base的新类

class Derived3: public Derived2, public Base {
public:
Derived(int num);
void display(){cout <<"hello";}
void other();
};

现在我想做这个

toto[0] = new Derived3

This my error message

从派生类“Derived3”到基类“Base”的转换不明确: Derived3 类 -> Base 类 Derived3 类 -> Derived2 类 -> Base 类

从不兼容类型“Derived3 *”分配给“Base *”

最佳答案

如果 toto[0] 总是指向 Derivedtoto[1] 总是指向 Derived2,你应该这样做:

class Foo{
private:
Derived d1;
Derived2 d2;
Base * toto[2];
public:
Foo(){
toto[0] = &d1;
toto[1] = &d2;
}

void doSomething() {
d1.other();
}
};

如果您确实有诚意需要创建无法静态检查键入的情况,请使用dynamic_cast。但如果可能的话,尽量避免这种情况。不要将 C++ 视为动态类型语言。

Derived* dptr = dynamic_cast<Derived*>(toto[0]);
if (dptr) {
dptr->other();
} else {
throw std::logic_error("toto[0] should point to Derived");
}

关于C++ 在子类中创建一个可用的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28776459/

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