c++中继承和派生问题

课上留的一个问题:定义了一个基类和一个派生类,想要从派生类中调用基类得成员函数,两种不同的表达形式是等价的吗

img

应该用下面这种,指定域。上面的不行,多态性还是会执行子类的print函数

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/182108
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:c++ 继承与派生(3)——分别用派生类的对象以及基类和派生类类型的指针来调用基类成员函数
  • 除此之外, 这篇博客: c++练习题---派生类使用基类的成员函数中的 类和函数接口定义: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 参见题目描述。
    
  • 以下回答由chatgpt基于相关博客总结生成:

    回答:

    是的,C++中有两种不同的表达形式可以从派生类中调用基类的成员函数。它们分别是:

    1.使用作用域运算符(::)直接调用父类函数

    使用作用域运算符能够直接调用父类函数。作用域运算符后面紧接着的是父类的类名和函数名,两者之间用双冒号隔开。示例如下:

    class A{
    public:
        void f(){
            cout<<"This is function f of A"<<endl;
        }
    };
    
    class B:public A{
    public:
        void g(){
            A::f(); //调用父类的函数f()
            cout<<"This is function g of B"<<endl;
        }
    };
    

    2.在子类中定义一个覆盖父类函数的新函数,并在新函数里调用父类函数

    在子类中定义一个新的和父类函数同名的函数,这样相当于是覆盖了父类函数。在新函数中,我们可以通过调用父类的函数来达到从子类中调用父类成员函数的目的。示例如下:

    class A{
    public:
        void f(){
            cout<<"This is function f of A"<<endl;
        }
    };
    
    class B:public A{
    public:
        void f(){
            A::f(); //调用父类的函数f()
            cout<<"This is function f of B"<<endl;
        }
    };
    

    在上面的例子中,函数f()被子类B覆盖了,但在覆盖的部分,我们又调用了A的f()函数,从而完成了从子类中调用父类函数的目的。

    这两种方法等价,它们都可以从派生类中调用基类的成员函数。具体使用哪一种,取决于具体情况而定。

    代码如下:

    #include <iostream>
    using namespace std;
    
    class Base {
        public:
            void func() {
                cout << "This is function func of Base." << endl;
            }
    };
    
    class Derived : public Base {
        public:
            void callBaseFunc() {
                //方法1:使用作用域运算符(::)直接调用基类函数
                Base::func();
    
                //方法2:通过子类函数调用基类函数
                func();
            }
    
            void func() {
                cout << "This is function func of Derived." << endl;
                Base::func();
            }
    };
    
    int main() {
        Derived d;
        d.callBaseFunc();
    
        return 0;
    }