在C ++下是否有办法让对象方法继承像构造函数继承一样? 我们有以下几点:
(myclass.h)
class B{
public:
B();
void doSomething();
};
class A : public B{
public:
A();
void doSomething();
}
(myclass.cpp)
B::B()
{
executeBCode();
}
void B::doSomething()
{
executeBCode();
}
A::A : B()
{
executeACode();
}
void A::doSomething()
{
executeACode();
}
如果调用A构造函数,我执行executeBCode()
然后执行executeACode()
。使用A对象上的方法调用doSomething()
,我只执行executeACode()
,因为它被覆盖了。
有没有办法让方法的行为像构造函数上的继承一样继承,所以执行派生代码和基本代码?
我遇到了这个问题,因为我需要我的代码中的基类为其派生类做一些事情,而且派生应该执行它自己的指令:这只是在派生上调用doSomething()
函数。
例如,这可能是在A上调用的closeAll()
方法的情况,其中基类关闭其自己的基础对象并派生其特定的东西。
答案 0 :(得分:2)
不可能直接使用,但是您可以通过以下方式使用Non-virtual interface idiom来达到足够接近的程度:
class A {
public:
void someFunction() {
//put the base's code here
someFuncImpl();//Calls the private function here
//or here, as you see fit
}
private:
virtual void someFuncImpl();//potentially pure: = 0;
};
然后在另一个班级:
class B : public A {
private:
virtual void someFuncImpl() {
//Derived's code goes here
}
};
这样,当您在类someFunction()
上调用B
时,您将同时拥有派生类的代码和执行的基类代码每一次。
这并不像构造者那样简单,但我认为这是你最接近和最简单的。您可以选择在派生代码之前或之后运行基本代码。
答案 1 :(得分:1)
如果我在此理解您的意图,则无法直接使用该语言(可能是其他语言)。可以使用两种替代机制/技术来实现类似的结果。
从派生类的函数调用基函数将起作用;
void A::doSomething()
{
B::doSomething();
executeACode();
}
使用template method pattern(在C ++ IO流库中使用),也称为NVI - non virtual interface,也可以使用;
class B {
void executeBCode();
virtual void doSomethingImp() = 0; // or not pure
public:
void pubDoSomething() { // public facing
executeBCode(); // order these as required
doSomethingImp();
}
};
class A {
void executeACode();
void doSomethingImp() override // internal implementation
{
executeACode();
}
};
答案 2 :(得分:0)
构造函数和析构函数之外没有内置机制。
您可以自己调用基本方法,或者使用template method pattern。
class B{
public:
B();
void doSomething();
};
class A : public B{
public:
A();
void doSomething()
{
B::doSomething();
}
}