我有以下虚拟代码:
#include <iostream>
#include <vector>
using namespace std;
class Parent {
public:
void printHello() {
cout << "Hello Parent" << endl;
}
};
class Child : public Parent {
public:
void printHello() {
cout << "Hello Child" << endl;
}
};
int main() {
vector<Parent*> list;
Child child;
list.push_back(&child);
list[0]->printHello();
}
Output: Hello Parent
我正在尝试创建从父类派生的类的对象列表。迭代它们并运行一个方法,它们都继承并覆盖。
我假设子类中的方法会覆盖父类中的方法。
我也尝试过使用vector<Parent>
代替vector<Parent*>
的方法。
结果是一样的。如何调用派生类的方法而不是父类?
答案 0 :(得分:5)
使用虚拟方法 - http://en.cppreference.com/w/cpp/language/virtual。详细了解他们here。
#include <iostream>
#include <vector>
class Parent {
public:
// using virtual keyword
virtual ~Parent() = default;
virtual void printHello() const { std::cout << "Hello Parent" << std::endl; }
};
class Child : public Parent {
public:
// using override keyword though its not necessary
void printHello() const override { std::cout << "Hello Child" << std::endl; }
};
int main()
{
std::vector<Parent *> list;
Child child;
list.push_back(&child);
list[0]->printHello();
}
Output -
Hello Child
答案 1 :(得分:4)
在C ++中,您必须在父类方法定义中使用虚拟来指定您将使用多态方法。 C ++中的默认行为不是多面的。
#include <iostream>
#include <vector>
using namespace std;
class Parent {
public:
virtual void printHello() {
cout << "Hello Parent" << endl;
}
};
class Child : public Parent {
public:
void printHello() {
cout << "Hello Child" << endl;
}
};
查看此信息以获取更多信息:Polymorphism in C++
答案 2 :(得分:0)
要获得所需的行为,需要在父类中声明该方法virtual
。有关详细信息,请参阅http://en.cppreference.com/w/cpp/language/virtual。