C+中的构造函数继承与方法继承+;物体 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(); }

C+中的构造函数继承与方法继承+;物体 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(); },c++,inheritance,C++,Inheritance,所发生的是调用构造函数,我执行executeBCode(),然后执行executeACode()。对于对象上的方法调用doSomething(),我只执行executeCode(),因为它被重写了。 有没有一种方法可以让方法上的继承行为类似于构造函数上的继承,从而同时执行派生代码和基代码? 我提出这个问题是因为我需要代码中的基类为它的派生类做一些事情,而且派生类应该执行它自己的指令:这只是在派生类上调用doSomething()函数。 这可能是在一个例子中调用的closeAll()方法的情况,其

所发生的是调用构造函数,我执行
executeBCode()
,然后执行
executeACode()
。对于对象上的方法调用
doSomething()
,我只执行
executeCode()
,因为它被重写了。 有没有一种方法可以让方法上的继承行为类似于构造函数上的继承,从而同时执行派生代码和基代码? 我提出这个问题是因为我需要代码中的基类为它的派生类做一些事情,而且派生类应该执行它自己的指令:这只是在派生类上调用
doSomething()
函数。
这可能是在一个例子中调用的
closeAll()
方法的情况,其中基类关闭它自己的基对象,派生类关闭它的特定内容。

在构造函数和析构函数之外没有内置机制

最接近的方法是自己调用基方法,或者使用


这不可能直接实现,但是您可以通过使用以下方法实现足够接近的目标:

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
    }
};
这样,在类
B
上调用
someFunction()
时,每次都会执行派生类的代码和基类的代码


这并不像构造函数所能做到的那样简单,但我认为这是最接近最简单的方法。作为奖励,您可以选择在派生代码之前或之后运行基代码

如果我理解你在这里的意图,就不可能直接用这种语言(可能是用其他语言)。有两种替代机制/技术可用于实现类似结果

从派生类的函数调用基函数将起作用

void A::doSomething()
{
    B::doSomething();
    executeACode();
}

使用(如C++中的流库),也称为,也可以工作;

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

您可以添加对
B::doSomething()的调用
void A::doSomething()
函数。否则调查.Calling
B::doSomething()
上的一个表示继承是无用的。我不能理解为什么它没有用C++语言在基法上使用关键字。也许在其他编程语言中也一样…
doSomething
没有被覆盖,它只是被另一个同名函数隐藏。重写意味着替换一个虚拟函数,而您没有虚拟函数。“意味着继承是无用的”这是一个完全愚蠢的语句。继承有很多用途,它没有做一件你想做的事,这并不意味着它“毫无用处”。基类必须被创建和销毁,因此对它们的构造函数和析构函数的调用有时是隐式的。必须调用基类函数是不正确的,因此对它们的调用不是隐式的。当派生类中碰巧有一个具有相同签名的函数时,您需要显式调用基类函数。“意味着继承是无用的”。。。来解决这个具体案例。由于建议的解决方案之一是直接调用基函数,我认为调用基函数的示例将大大增强这个答案。在最后一个示例中,调用
a.doSomething()
只会执行
executeCode()没有,但我忘了将
B
声明为
公共a
。您不需要在
B
中声明
someFunction()
,因为当它继承
A
时,它也有成员函数。
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();
    }
};