迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

C++ 调用基类方法

作者:迹忆客 最近更新:2023/08/22 浏览次数:

本文将讨论使用 C++ 从子类调用父类方法。 首先,我们将快速刷新继承。

稍后我们将讨论不同场景下调用基类方法以及相关问题。


C++ 中的继承

继承是面向对象编程的一个强大功能。 通过继承,子类可以共享父类的属性和函数,从而促进 OOP 中的可重用性。

在继承中,两个类形成一种称为“父子”、“基础-派生”或“通用-专业”关系的关系; 然而,最常采用的是源自基础的术语,而不是父项和子项。

C++中继承的语法:

class Parent{..};
class Child: InheritanceSpecifier Parent{...};

要创建派生类,我们必须编写 InheritanceSpecifier,后跟基类的名称。 此处,InheritanceSpecifier 可以是公共的、私有的或受保护的。

而且,如果继承时指定了多个父类的名称,则可以是多重继承。 有关继承类型的更多信息可以在这里找到。

为了让事情变得简单,我们将在整篇文章中使用公共继承。 我们可以在子类中并使用子类的对象调用基类方法(如果不是私有的),如下面的代码所示。

class P{
    public:
        void pf(){ cout << "Parent class function\n";}
 };
class C: public P{
    public:
        void cf(){
            pf();
            cout <<"Child class function\n";
        }
};
int main(){
    C cObj;
    cObj.cf();
    cObj.pf();
    return 0;
}

我们创建了一个父类 P,它是从子类 C 公开继承的。子类 C 中的 cf() 函数调用基方法 pf()。

类似地,在驱动程序代码(即main())中,子对象cObj直接调用基类方法。

输出:

Parent class function
Child class function
Parent class function

上面的例子对于理解基类函数的调用非常简单:在子类中以及子类的对象中。

但是,更复杂的情况在调用基本方法时可能需要额外小心,如以下段落中所述。


调用基类方法时的问题

前面的代码和输出中调用基类方法似乎没有问题。 但是,会出现一些相关的问题,例如父类和子类是否具有相同的功能,或者子类有两个或多个具有相同功能的父类。

我们来一一讨论这些问题。

父母和孩子有相同的功能

父类和子类可能具有相同的功能,并且在某些情况下,我们可能希望用子类对象来调用父类函数,或者我们可能希望在子类内部调用父类函数。

首先,让我们看一下演示该场景的代码。

class Parent{
    public:
        void f(){    cout << "Parent class function\n";    }
 };
class Child: public Parent{
    public:
        void f(){    cout <<"Child class function\n";    }
};
int main(){
    Child cObj;
    cObj.f();
    return 0;
}

输出:

Child class function

这里,请注意,子类对象调用子类的 f() 函数(而不是来自父类)。 要通过子类对象调用父类的 f(),我们必须使用父类名称和作用域解析运算符 (::),如以下代码所示。

class Parent{
    public:
        void f(){    cout << "Parent class function\n";    }
 };
class Child: public Parent{
    public:
        void f(){    cout <<"Child class function\n";    }
};
int main(){
    Child cObj;
    cObj.Parent::f(); //calling f() of parent class
    cObj.f();
    return 0;
}

输出:

Parent class function
Child class function

请参阅 main() 函数中的第二行,其中我们使用了父类名称和范围解析运算符。 相应地,在输出的第一行,我们可以看到父类的f()打印的消息。

应遵循确切的语法来调用子类中的基类函数,如下面的代码所示。

class Parent{
    public:
        void f(){    cout << "Parent class function\n";    }
 };
class Child: public Parent{
    public:
        void f(){
            Parent::f();
            cout <<"Child class function\n";
        }
};
int main(){
    Child cObj;
    cObj.f();
    return 0;
}

输出:

Parent class function
Child class function

多重继承歧义

调用基类方法的第二个问题是多个(两个或多个)类父类可以具有相同的方法。 在这种情况下,编译器会混淆选择特定的基类来调用该方法,因为相同的方法存在于多个基类中。

让我们看一下在选择特定基类来调用基方法时将为编译器生成编译时歧义的代码。

class P1{
    public:
        void fun(){    cout << "Fun from P1\n";    }
};
class P2{
    public:
        void fun(){    cout << "Fun from P2\n";    }
};
class C:public P1, public P2{};
int main(){
    C objC;
    objC.fun();
    return 0;
}

这里,类 C 继承自两个基类(即 P1 和 P2),并且两个父类都有一个具有相同签名的 fun() 方法。

现在,当驱动程序代码通过子对象 (objC) 调用 fun() 函数时,编译器会在选择正确的基类时感到困惑。

让我们看看编译器消息。

base_class_3.cpp: In function ‘int main()’:
base_class_3.cpp:16:7: error: request for member ‘fun’ is ambiguous
  objC.fun();

该消息清楚地表明编译器感到困惑。 同样,解决方案是相同的,即使用类名和范围解析运算符。

请参阅代码和相关输出。

class P1{
    public:
        void fun(){    cout << "Fun from P1\n";    }
};
class P2{
    public:
        void fun(){    cout << "Fun from P2\n";    }
};
class C:public P1, public P2{};
int main(){
    C objC;
    objC.P1::fun();
    objC.P2::fun();
    return 0;
}

输出:

Fun from P1
Fun from P2

请参阅 main() 中的第 2 行和第 3 行,其中 P1 和 P2 类名与范围解析运算符一起使用。 因此,在输出中,您可以看到两个基本函数的输出。

上一篇:检查C++中的链表是否为空

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

检查C++中的链表是否为空

发布时间:2023/08/22 浏览次数:127 分类:C++

链表具有多个动态分配的节点,其中包含一个值和一个指针。 本教程将教您三种在 C++ 中检查链表是否为空的方法。C++ 中使用根元素检查链表是否为空 链表中的根充当一个元素,即使链表为空

C++ 中的移动语义

发布时间:2023/08/22 浏览次数:160 分类:C++

在本文中,我们将讨论 C++ 中的移动语义:我们将讨论深拷贝和浅拷贝的相关概念 我们将快速讨论左值和右值的概念。 我们将尝试通过示例来理解移动语义。

在 C++ 中抛出异常

发布时间:2023/08/21 浏览次数:200 分类:C++

C++抛出异常是C++的一个强大功能,可用于处理错误和意外事件。 它主要用于终止程序的执行或将控制权转移到程序的不同部分。在 C++ 中抛出异常

C++ 中抛出超出范围的异常

发布时间:2023/08/21 浏览次数:176 分类:C++

This article discusses how to throw an out of range exception in C++. It also discusses the possible errors while throwing out of range exception in C++.

在 C++ 中抛出异常消息

发布时间:2023/08/21 浏览次数:192 分类:C++

它是通过在程序中可能出现问题的地方抛出异常来执行的。 C++ 中有几个异常处理关键字,但本文将介绍如何使用可变消息引发异常。使用标准 C++ 异常抛出带有消息的异常 - 无效参数

C++ 中的 A Declaration Shadows a Parameter 错误

发布时间:2023/08/21 浏览次数:188 分类:C++

每个对象或变量总是有一些边界、范围或作用域来访问其他类成员,例如由 C++ 中的访问说明符定义为 public、private 或 protected 的数据成员或成员函数。当我们在程序的特定范围或块中多次定义

C++ 中的错误 Error ID Returned 1 Exit Status

发布时间:2023/08/21 浏览次数:130 分类:C++

C++ [Error]: Id returned 1 exit status 不是常见错误。 这通常意味着程序崩溃了,并且在不查看堆栈跟踪的情况下很难确定原因。

C++ 中错误 Too Many Arguments to Function

发布时间:2023/08/21 浏览次数:178 分类:C++

我们在编写一段代码时会遇到很多错误。 解决错误是编程中最关键的部分之一。本文将讨论我们在 C++ 中遇到的一个错误:Too Many Arguments to Function。

处理 C++ 中的错误

发布时间:2023/08/21 浏览次数:197 分类:C++

本文讨论了 C++ 中的错误和异常处理。C++ 中的错误处理 C++ 程序中可能存在多种类型的错误。 有些错误需要向用户发出提示。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便