从其基类列表中调用重写的函数
Calling an overridden function from a list of its base class?
假设我有一个带有虚函数的空类:
class Base
{
public:
virtual void Foo(){std::cout << "this is the base class";}
}
然后我有一个继承自Base
并覆盖Foo()
的类:
class Derived : public Base
{
public:
void Foo(){std::cout << "this is the derived class";}
}
然后还有其他一些类包含Base
列表:
class OtherClass
{
public:
std::vector<Base> listOfBases; //note it's not std::list<Derived>
}
如何循环浏览listOfBases
并为Derived
类而不是Base
类调用Foo()
?现在,如果我说listOfBases[i].Foo();
那么这是基类将打印的,但我希望打印Derived
类中被覆盖的那个。
我可以把它做成一个Derived
列表而不是Base
,这会修复它,但我将把这些继承的类称为各种不同的东西,所以我需要一个Base
列表。
那么如何从其基类列表中调用被覆盖的函数呢?
您需要使用Base*
列表(即指向 Base 的指针),或者最好是 std::unique_ptr<Base>
或 std::shared_ptr<Base>
。
这是因为对象模型和复制C++。派生类必须至少与其基类一样大(它们的大小可以相同,具体取决于派生类是否为空)。由于C++在向vector
添加项目时利用复制(或可能在C++11中移动),它必须为n个Base
对象分配足够的空间。由于vector
几乎总是围绕简单array
的包装器,试图将一个(可能大小不同)Derived
对象添加到Base
对象的array
中是未定义的行为。
获取指向每个基类的指针,然后将其向下转换为派生类。之所以称为向下转换,是因为在 UML 图中,通常将基类绘制在派生类之上。
for ( auto q = listOfBases.begin(); q != listOfBases.end(); ++q )
{
Base* pBase = &(*q); // Get pointer to Base class. Can't downcast on object.
Derived* pDerived = dynamic_cast<Derived*>(pBase); // Downcast
pDerived->Foo(); // Call Foo() of Derived
}
相关文章:
- C++调用使用重写函数的父类函数
- 重写函数不打印基类数据
- 在 c++ 中重写函数时如何选择基类?
- 为什么继承的函数忽略了在原始函数中调用的重写函数?
- 在不提供定义的情况下重写函数有什么意义?
- 建议用户使用 lambda 重写函数
- 如何创建使用重写函数的非成员函数?
- 调用重写函数并使用基类中的重载变量
- 重写函数的默认参数
- 从父级调用派生类重写函数.C++
- C++子类中的重写函数成员
- 函数中的指针不称为派生类的重写函数
- 基类数组中重写函数的使用
- 如何使用协变参数重写函数(在抽象基类中)
- c++ 调用子类而不是父类的重写函数
- C++:从模板化基类重写函数
- 使用派生类的类型重写函数参数类型
- c++仅为特定实例重写函数
- 需要一个关于用const参数重写函数的警告
- Qt/C++重写函数而不进行子类化