从指向基础 class 对象的指针向量调用派生 classes 的独特函数
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()
}
Base 不是多态的(没有虚函数)。根据这些条件,我如何才能为 v 中的每个 Derived1 对象调用 func1 并为每个 Derived2 对象调用 func2?
"Base is not polymorphic (no virtual
function)."
您仍然可以执行 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
构造函数中设置不同的成员变量26=]
添加一个枚举成员变量来指示它是哪个Derived
,这样你就可以在外部做一个开关来做一个安全的static_cast
.
添加一个 virtual ~Base()
,这样您就可以执行 dynamic_cast
s 而不是切换。
实际上没有 Derived1
或 Derived2
继承自 Base
,而是有 variant<Derived1, Derived2>
.
???
利润。
#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()
}
Base 不是多态的(没有虚函数)。根据这些条件,我如何才能为 v 中的每个 Derived1 对象调用 func1 并为每个 Derived2 对象调用 func2?
"Base is not polymorphic (no
virtual
function)."
您仍然可以执行 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
构造函数中设置不同的成员变量26=]添加一个枚举成员变量来指示它是哪个
Derived
,这样你就可以在外部做一个开关来做一个安全的static_cast
.添加一个
virtual ~Base()
,这样您就可以执行dynamic_cast
s 而不是切换。实际上没有
Derived1
或Derived2
继承自Base
,而是有variant<Derived1, Derived2>
.???
利润。