我遇到了多态性和父子关系的问题。采取以下两个类,并在我的应用程序中想象我创建一个'child'对象。在对象之外,我调用的唯一函数是update(),它反过来调用对象中我需要的所有其他东西。这个调用序列中唯一一个在'parent'和'child'中不同的函数是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库和可执行文件),现在事情按预期工作了。
答案 0 :(得分:3)
您没有将基类中的函数标记为虚拟:
class parent
{
public:
virtual void dosomething1() {}; //amongst other things, calls dosomething2
virtual void dosomething2() {};
void update() {}; //amongst other things, calls dosomething1
}
此外,仅供参考,您正在做的事情称为template method pattern。
答案 1 :(得分:2)
如果您需要virtual
,则应在父类中使用关键字dynamic-polymorphism
。然后在子类中重新实现或不重新实现虚函数。
class parent
{
public:
void dosomething1() {}; //amongst other things, calls dosomething2
virtual void dosomething2() {};
void update() {}; //amongst other things, calls dosomething1
}
答案 2 :(得分:1)
您应该制作相关的功能virtual
。假设您希望通过调用child
来调用doSomething1()
的{{1}}和doSomething2()
:
update()
然后,调用class parent
{
public:
virtual void dosomething1() {}; //amongst other things, calls dosomething2
virtual void dosomething2() {};
void update() {}; //amongst other things, calls dosomething1
}
class child : public parent
{
virtual void dosomething2() {}
}
的{{1}}将调用派生类的方法(如果可用)。请注意,child
更新update()
child`或您将隐藏该名称。