【发布时间】:2026-02-13 23:00:01
【问题描述】:
我有一个 Base* 对象数组。这包含一堆派生对象,其中一些可能实现Interface。
struct Base {
virtual void doNotCallThis() { cout << "nooo" << endl; }
};
struct Interface {
virtual void doThis() = 0;
};
// Example derived class
struct Derived : Base, virtual Interface {
virtual void doThis() { cout << "yes" << endl; }
};
int main() {
Base* b[1];
b[0] = new Derived(); // Here would be a bunch of different derived classes
((Interface*)b[0])->doThis(); // Elsewhere, doThis() would be called for select array elements
return 0;
}
输出:
nooo
我不知道运行时b[i] 的确切类型,所以我无法转换为Derived(可能是Derived2、Derived3 等)。如果这是一个解决方案,我也不能使用 dynamic_cast。我所知道的是,当我调用doThis() 时,b[i] 是一个继承自Interface 的类型。我试图在上面调用它的方式会导致调用错误的函数,例如。 Base::doNotCallThis().
如何正确称呼它?
【问题讨论】:
-
您不能合法地将
b[0]转换为Interface*,这只是未定义的行为。 -
我本以为正确的做法是引入一个继承
Base和Interface的中间基类,所有Derived类都可以依赖-然后使@987654338 @进入那个班级。 -
@MatsPetersson 我会这样做,但一些
Derived类继承自Base的派生,这将导致它们派生两次。 -
因此必须重新定义这些类才能从新的中间类继承!
-
@MatsPetersson 如果这就是你所说的,有点困惑:我有
Base、Base1 : Base、Base2 : Base等等。说 10 个推导。因此,对于与Interface一起使用的每一个,我都必须定义JoinedBaseNumberX : BaseX, virtual Interface?然后我也不知道要使用哪个连接派生......
标签: c++ function inheritance polymorphism