【问题标题】:Calling inherited functions and overriding behavior in c++在 C++ 中调用继承函数和覆盖行为
【发布时间】:2022-12-31 13:21:20
【问题描述】:

为什么会出现此错误 - “void D::func(const D &)”:无法将参数 1 从“const C”转换为“const D &”

如何更正此问题,我想从 Derived func 调用 Base 函数但请注意 func 是友元函数?

class C
{
public:
    C()
    {
        cout << "in C ctor" << endl;
    }

    friend void func(const C& abc1)
    {
        cout << "in C's func" << endl;
    }
};

class D : public C
{
public:
    D()
    {
        cout << "in D ctor" << endl;
    }

    void func(const D& abc)
    {
        func(static_cast<const C&>(abc));
        cout << "in D's func" << endl;
    }
};

int main()
{
    D d;
    d.func(d);
}

为什么这类似虽然工作 -

https://ideone.com/eNmvng

【问题讨论】:

    标签: c++ visual-c++


    【解决方案1】:

    在面向对象的编程中,定义一个包含通用功能的基类,然后创建继承自基类并扩展或修改其行为的派生类通常很有用。这允许您重用代码并创建共享公共接口的类层次结构。

    要在派生类中调用继承的函数,可以使用“base”关键字后跟函数名。例如:

    class BaseClass
    {
      public:
        virtual void DoSomething()
        {
          // Implementation of DoSomething()
        }
    };
    
    class DerivedClass : public BaseClass
    {
      public:
        void DoSomething() override
        {
          // Override implementation of DoSomething()
          base.DoSomething(); // Call the inherited DoSomething() function
        }
    };
    

    在此示例中,DerivedClass 派生自 BaseClass 并覆盖 DoSomething() 函数。覆盖实现使用“base”关键字调用继承的 DoSomething() 函数。

    覆盖派生类中的函数允许您在不更改基类的情况下修改或扩展函数的行为。当您想要重用基类功能但要为特定的派生类自定义它时,这会很有用。

    重要的是要注意,当您重写派生类中的函数时,您应该使用“覆盖" 关键字表示您有意覆盖基类实现。这有助于避免意外覆盖并确保

    【讨论】:

    • 对我不起作用,这是专门针对 C++ 的,对不起,我之前没有在标题中仅在标签中提到,在 C++ 中,当我尝试这个时,我得到了未声明的基本标识符,也许你的答案是针对 Java 的?
    • 尽管您可以通过typedefusing 语句提供显式别名,但在 C++ 中您使用它的方式没有 base 的概念,但即便如此您也不会通过 . 运算符访问它。您需要使用范围运算符:: 来调用基本成员,如BaseClass::DoSomething()
    • @CaptainObvlious 是的,这里唯一的问题是它在我的例子中是友元函数,所以不能使用 BaseClass::DoSomething() 为什么这个工作 - ideone.com/eNmvng
    • @user123456 查看friend specifier 上的一些炸弹挖掘文档
    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多