从基类对象的指针向量调用派生类的唯一函数
Invoke unique functions of derived classes from a vector of pointers to base class objects
#include <iostream>
#include <vector>
using namespace std;
class Base
{
public:
void speak() { cout << "Hello!"; }
};
class Derived1 : public Base
{
public:
void func1() { cout << "I'm a function!"; }
};
class Derived2 : public Base
{
public:
void func2() { cout << "I'm also a function!"; }
};
int main()
{
vector<Base*> v = { new Derived1(), new Derived2(), new Derived1(), new Derived2() //, ...
};
// For each Derived1 object invoke func1() and for each Derived2 object invoke func2()
}
基不是多态的(没有虚拟函数(。根据这些条件,我如何能够为v中的每个Derived1对象调用func1,为每个Derived2对象调用func2?
"碱基不是多态的(没有
virtual
功能(。">
你仍然可以做static_cast<Derived1>(v[0])
/static_cast<Derived2>(v[1])
,a.s.o,只要你确定在特定的索引上会得到什么。
照原样,这是不可能的。不能执行dynamic_cast
,没有表示一种或另一种类型的成员。对于给定的Base*
,绝对没有办法区分它是Derived1*
还是Derived2*
。
您必须执行以下操作之一:
-
添加两个不同类将覆盖的
virtual void func() = 0;
。 -
添加类型为
std::function<void()>
的成员变量,这两个Derived
类将在Base
构造函数中以不同方式设置该成员变量。 -
添加一个枚举成员变量来指示它是哪个
Derived
,这样您就可以在外部进行切换以执行安全的static_cast
。 -
添加一个
virtual ~Base()
,这样就可以执行dynamic_cast
s,而不是切换。 -
实际上并没有从
Base
继承Derived1
或Derived2
,而是有一个variant<Derived1, Derived2>
。 -
???
-
利润。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 何时在引用或唯一指针上使用移动语义
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 如何委托派生类使用其父构造函数?
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 计算排序向量的向量中唯一值的计数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 如何使用单独文件中的派生类访问友元函数对象
- 派生类销毁的最佳实践是什么
- 如何使用基类指针引用派生类成员
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 存储模板类型以强制转换回派生<T>
- 从基类的唯一指针中声明派生类的类型
- 基类的指针数组:如何调用唯一的派生类方法
- 通过基类容器访问派生类唯一变量的最佳方式
- 从基类对象的指针向量调用派生类的唯一函数