如何访问模板为 class 的向量中类型为 subclass 的对象的覆盖函数
How to access the overidden function of an object of type subclass which is in a vector with a template of class
我有一个 class A,它定义了一个空函数 foo,等等。
两个subclass继承自A,AA和AB。这两个都以不同的方式覆盖 foo。
一个单独的 class,C,需要保存子 classes 的不同实例,所以我定义了一个向量,其中包含 class A 的模板。问题是,当我尝试通过从 C 中的向量访问 subclass 来 运行 foo 时,它 运行s 是 A 中 foo 的空版本,而不是来自AA 或 AB。
我怎样才能在 C 中拥有一个 vector,它可以容纳 subclasses 的不同实例并能够 运行 foo 的覆盖版本?
如果您希望在代码中看到 classes -
A
class A
{
public:
A();
foo() {}
};
AA
class AA : public A
{
public:
AA();
foo() { //does something else }
};
AB
class AB : public A
{
public:
AB();
foo() { //does a different something else }
};
C
class C
{
public:
C();
private:
std::vector<A> things;
};
在 C 中,如果我尝试 运行 things.at(x).foo()
它会调用 A 中的 foo,但我需要从正确的子 class.[=16 中调用 foo =]
感谢您提供的任何建议!
您需要将基础 class 函数标记为虚拟函数。默认情况下,C++ 方法是 non-virtual,所以你所有的 foo()
实例都是完全独立的方法,它们恰好具有相同的名称。
如果您使用的是现代编译器,您还应该使用 override
标记您的派生方法,让编译器检查您是否确实覆盖了基础 class 方法。
您也不能在向量中按值存储对象,您需要存储指针、引用、unique_ptr
或 shared_ptr
。如果在将对象添加到向量时按值存储,它将被复制到 A
类型的新对象中
我有一个 class A,它定义了一个空函数 foo,等等。 两个subclass继承自A,AA和AB。这两个都以不同的方式覆盖 foo。
一个单独的 class,C,需要保存子 classes 的不同实例,所以我定义了一个向量,其中包含 class A 的模板。问题是,当我尝试通过从 C 中的向量访问 subclass 来 运行 foo 时,它 运行s 是 A 中 foo 的空版本,而不是来自AA 或 AB。
我怎样才能在 C 中拥有一个 vector,它可以容纳 subclasses 的不同实例并能够 运行 foo 的覆盖版本?
如果您希望在代码中看到 classes -
A
class A
{
public:
A();
foo() {}
};
AA
class AA : public A
{
public:
AA();
foo() { //does something else }
};
AB
class AB : public A
{
public:
AB();
foo() { //does a different something else }
};
C
class C
{
public:
C();
private:
std::vector<A> things;
};
在 C 中,如果我尝试 运行 things.at(x).foo()
它会调用 A 中的 foo,但我需要从正确的子 class.[=16 中调用 foo =]
感谢您提供的任何建议!
您需要将基础 class 函数标记为虚拟函数。默认情况下,C++ 方法是 non-virtual,所以你所有的 foo()
实例都是完全独立的方法,它们恰好具有相同的名称。
如果您使用的是现代编译器,您还应该使用 override
标记您的派生方法,让编译器检查您是否确实覆盖了基础 class 方法。
您也不能在向量中按值存储对象,您需要存储指针、引用、unique_ptr
或 shared_ptr
。如果在将对象添加到向量时按值存储,它将被复制到 A