加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C继承,覆盖时仍然会调用基函数

发布时间:2020-12-16 10:42:19 所属栏目:百科 来源:网络整理
导读:我有以下两个类,一个继承自另一个 Class A{ void print(){cout "A" endl;}}Class B : A{ void print(){cout "B" endl;}}Class C : A{ void print(){cout "C" endl;}} 然后在另一个课程中我有以下内容: vectorA things;if (..) things.push_back(C());else i
我有以下两个类,一个继承自另一个

Class A{
  void print(){cout << "A" << endl;}
}

Class B : A{
  void print(){cout << "B" << endl;}
}
Class C : A{
  void print(){cout << "C" << endl;}
}

然后在另一个课程中我有以下内容:

vector<A> things;
if (..)
  things.push_back(C());
else if (..)
 things.push_back(B());

things[0].print();

这总是打印A.
我想要打印B或C取决于我添加到矢量中的东西
我该怎么做呢?
我尝试过抽象,但我不完全确定如何在C中使用它,它并没有为我工作

解决方法

如前所述,您需要虚函数来启用多态行为,并且不能通过向量中的值直接存储类.

当您使用std :: vector< A>时,您将按值存储,从而存储您添加的对象,例如via push_back()被复制到A的实例,这意味着你将丢失对象的派生部分.这个问题被称为object slicing.

正如已经建议的那样,您可以通过将指针(或智能指针)存储到基类来避免这种情况,因此只有指针被复制到向量中:

std::vector<A*> things;
things.push_back(new B());
// ... use things:
things[0]->print();

// clean up later if you don't use smart pointers:
for(std::vector<A*>::iterator it = things.begin(); it != things.end(); ++it)
    delete *it;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读