如何解决指向基类理解代码的指针列表
我正在接受 C++ 考试培训,我不明白为什么代码只显示基类的打印函数(也在我调试代码之后),而从不去派生类的打印。 你能用简单的方式解释一下为什么吗,我是否可以做一些问题,以便仅通过编辑几行代码就可以显示派生类的打印功能。 假设程序生成的数字是:1 67 0 69 0 0 58 78。
class A
{
int a;
public:
A(int x):a(x){}
void print() { cout << "a=" << a << ' '; }
};
class B:public A
{
int b;
public:
B(int x,int y) :A(x),b(y) {}
void print() { A::print(); cout << "b=" << b << ' '; }
};
int main(){
list<A*> lst;
for (int i = 0; i < 3; i++)
if(rand()%2)
lst.push_back(new A(rand() % 100));
else
lst.push_back(new B(rand() % 100,rand()%100));
for (list<A*>::iterator it = lst.begin(); it != lst.end(); it++)
(*it)->print();
}
解决方法
您需要声明 print()
virtual 才能使多态起作用。
这是您建议的格式改进示例,
#include <iostream>
#include <list>
class A{
int a;
public:
A(int x):a(x){}
virtual void print() { std::cout << "a=" << a << ' '; }
};
class B:public A{
int b;
public:
B(int x,int y) :A(x),b(y) {}
void print() override { A::print(); std::cout << "b=" << b << ' '; }
};
int main(){
std::list<A*> lst;
for (int i = 0; i < 30; i++) {
if(rand()%2) {
lst.push_back(new A(rand() % 100));
} else {
lst.push_back(new B(rand() % 100,rand()%100));
}
}
for (std::list<A*>::iterator it = lst.begin(); it != lst.end(); it++) {
(*it)->print();
}
}
我增加了打印元素的数量,因为在这些设置中我没有得到一个 b
。这说:
- 如果您不想一遍又一遍地获得相同的数字,则需要使用
srand
为您的代码设置种子(并且每个程序只需要为其设置一次种子)。 - 如果可能,您应该使用从 C++11 开始提供的
new random number
生成功能。 -
override
是可选的,但非常值得鼓励,它清楚地表明该函数是虚拟的并且是重新实现的。 - 最重要的是,您需要释放用
new
分配的内存(使用delete
),或者更好的是,使用@TedLyngmo 答案(智能指针)中的方法
为了使用动态调度,您需要使 A::print()
virtual
。您还需要使 A
的析构函数 virtual
能够通过基类指针 delete
对象。
由于您目前没有 delete
任何对象(而是泄漏所有 A
和 B
),我建议您使用智能指针,{{1} },它会在 std::unique_ptr<A>
被销毁时清理。
示例:
std::list
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。