gpt4 book ai didi

c++ - 虚函数题

转载 作者:太空宇宙 更新时间:2023-11-04 14:36:38 25 4
gpt4 key购买 nike

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>

class Helper
{
public:
Helper() { init(); }
virtual void print() {
int nSize = m_vItems.size();
std::cout << "Size : " << nSize << std::endl;
std::cout << "Items: " << std::endl;
for(int i=0; i<nSize; i++) {
std::cout << m_vItems[i] << std::endl;
}
}
protected:
virtual void init() { m_vItems.push_back("A"); }
std::vector<std::string> m_vItems;
};

class ItemsHelper : public Helper
{
public:
ItemsHelper() { }
protected:
virtual void init() {
Helper::init();
m_vItems.push_back("B");
}
};

int _tmain(int argc, _TCHAR* argv[]) {
ItemsHelper h;
h.print();
}

此输出表示 vector 的大小为 1。我预计大小为 2,因为在 ItemsHelper::init 函数中我调用了基类 Helper::init() 函数,然后我向 vector 添加第二个项目。问题是,ItemsHelper::init 没有被调用,而是调用了基类 init 函数。

我想要调用 ItemsHelper::init 函数,我可以通过在 ItemsHelper 构造函数中而不是在基类中调用 init 函数来实现。 但是,问题是,是否有更好的方法来实现这一点并仍然保持对基类中的 init() 的调用?因为如果我想创建一个 Helper 对象而不是 ItemsHelper,那么 init 函数将永远不会被调用。

顺便说一句,这是我在一个更大的对象中看到的问题的简化版本,例如,我只是制作了这些对象。

最佳答案

在基类构造函数中,派生类尚未构造,因此派生类上的覆盖函数尚不可用。某处有关于此的 FAQ 条目...我找不到。

最简单的解决方案是将 init.push_back("A") 部分放入 Helper 构造函数和 .push_back("B")ItemsHelper 构造函数中。这似乎做了你想做的事情,并删除了不必要的 init 虚函数。

关于c++ - 虚函数题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2074494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com