gpt4 book ai didi

c++ - 未调用虚拟方法

转载 作者:行者123 更新时间:2023-11-30 00:53:17 26 4
gpt4 key购买 nike

我正在编写一个类 BTree,以在 C++ 中实现二叉树,我正在使用 Google Test 对其进行测试。我已经为基类创建了一个虚方法 visit(),它在每次调用时打印出当前节点的数据。

通过目测,我可以看到数字以正确的顺序输出。但是,我希望能够使用 Google Test 自动测试它。为此,我创建了一个子类 InOrderTest,它覆盖了 visit() 方法,以便它附加到字符串而不是打印出来。但是,正在调用基类版本而不是子类。我做错了什么?

这是测试用例:

TEST_F(BTreeTestSuite, inOrder)
{
class InOrderTest : public BTree
{
public:
InOrderTest(int data) throw(int) : BTree(data), itsVisitString() {};
std::string visitString(void) const { return itsVisitString; }
virtual void visit()
{
std::ostringstream oss;
oss << itsData;
itsVisitString += oss.str();
std::cerr << "vs1: " << itsVisitString << '|' << std::endl;
itsVisitString += " ";
std::cerr << "vs2: " << itsVisitString << '|' << std::endl;
}
private:
std::string itsVisitString;
};
InOrderTest iot(20);
iot.insert(30);
iot.insert(15);
iot.insert(10);
iot.inOrder();
EXPECT_STREQ("10 15 20 30 ", iot.visitString().c_str());
}

这是基类的(希望)相关部分:

class BTree
{
public:
BTree(int data) throw(); // constructor(s)
~BTree() throw(); // destructor

void insert(int data);
unsigned count() const;
void inOrder() const;

int data() const throw() { return itsData; };
BTree *left() const throw() { return itsLeft; };
BTree *right() const throw() { return itsRight; };
protected:
virtual void visit() const;
int itsData;
private:
// Don't allow creation of BTree without data
BTree() throw(); // constructor(s)
BTree *itsLeft;
BTree *itsRight;
protected:
};
...
void BTree::inOrder() const
{
if (itsLeft) itsLeft->inOrder();
visit();
if (itsRight) itsRight->inOrder();
}

void BTree::visit() const
{
cout << itsData << endl;
}

最佳答案

您没有包含 const。这改变了函数的签名,最终将函数的签名隐藏在基类中而不是覆盖它。出于这个原因,在重写函数时附加 override 是个好主意,因为这样当它不重写任何东西时你会得到一个编译器错误(尽管 C++11 只在那个函数上) ).将其更改为:

virtual void visit() const /*override*/ {
//^^optional, especially with the override

关于c++ - 未调用虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16705627/

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