我遇到了多态性和父子关系的问题。采取以下两个类,并想象在我的应用程序中我创建了一个“孩子”对象。在对象之外,我调用的唯一函数是 update(),它反过来调用对象中我需要的所有其他内容。在这一系列调用中,“父”和“子”中唯一不同的函数是 dosomething2()。
class parent
{
public:
void dosomething1() {}; //amongst other things, calls dosomething2
void dosomething2() {};
void update() {}; //amongst other things, calls dosomething1
}
class child : public parent
{
void dosomething2() {}
}
我意识到,如果我创建一个 'child' 对象并调用 update(),则只会调用父类函数。我不得不将 update() 和 dosomething1() 复制到子类,然后一切都按预期工作。这不是一个很好的解决方案,因为有很多重复的代码 - 有没有办法改进这个?
更新: 感谢提供的答案,我使用虚拟 dosomething2() 函数更新了父类。现在调用了正确的函数,我不必将 dosomething1() 复制到子类。不幸的是,如果我不将 update() 复制到子类,则会出现符号查找错误(父子类都在一个库中)。
class parent
{
public:
void dosomething1() {}; //amongst other things, calls dosomething2
virtual void dosomething2() {};
void update() {}; //amongst other things, calls dosomething1
}
class child : public parent
{
void dosomething2() {}
/*void update() {}; //symbol lookup error if this is left uncommented */
}
UPDATE2 符号查找错误与代码无关。我做了一个 make clean,然后 make(它构建了一个 .so 库和可执行文件),现在一切都按预期工作了。