构造函数继承与C ++对象中的方法继承

时间:2014-10-31 08:49:33

标签: c++ inheritance

在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()方法的情况,其中基类关闭其自己的基础对象并派生其特定的东西。

3 个答案:

答案 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();
    }
}