继承中的函数定义

Posted

技术标签:

【中文标题】继承中的函数定义【英文标题】:Function definition in Inheritance 【发布时间】:2018-09-01 06:54:11 【问题描述】:

在公开继承一个类时,如果基类的公共成员被派生类继承,为什么不能使用派生类的名称定义基类的函数?

例子:

#include <iostream>
using namespace std;

class one
    int a;
public:
    void get(int);
    void show();
;

class two:public one

    int b;
public:
    void getb(int);
    void dis();
;

void one::get(int x)  //if i write void two::get(int x) here it gives error

    a = x;

void one::show()  //same goes for this function why can't i define it as `void two::show()`?

  cout << a << endl;


int main()

    two ob;
    int x;
    cin >> x;
    ob.get( x );
    ob.show();

那么如果one类的所有公共成员函数都被two类继承,为什么我不能使用two类的名称来定义one类的函数呢?

【问题讨论】:

因为class one 不是抽象类——如果你实例化one 的新实例,它应该使用什么实现? 因为aprivateone 的成员,因此无法在类one 之外访问。或者您的问题不清楚...您遇到了什么错误? 你试过override了吗? 【参考方案1】:

为什么?

在类定义中,您说two 继承自one。所以它将有以下公共成员:

void get(int);       publicly inherited from one
void show();         publicly inherited from one
void getb(int);      own member
void dis();          own member

你只能定义two自己的成员函数,这里是two::getb(int)two::dis()。但是你不能定义two::show(),因为它是在一个中定义的,而你没有告诉编译器你想要它。

有没有办法拥有不同版本的继承函数?

如果您将类定义如下:

class two:public one

    int b;
public:
    void getb(int);
    void dis();
    void show();     //yes you can, but you'll have to define it 
;

那么您将拥有以下公共成员:

void get(int);       publicly inherited from one
void one::show();    publicly inherited from one but hidden 
void show();         own member
void getb(int);      own member
void dis();          own member

您可以定义以下内容:

void two::show()  //no problem !!

  cout << "two's version" << endl;

您甚至可以在main() 中选择您要拨打的电话:

ob.get( x );          // one::get(), because there's no two::get()
ob.show();            // by default two::show(), because ob is a two
ob.one::show();       // yes you can !!

这里是online demo

想要多态性?

在上述所有代码中,调用的函数取决于用于访问对象的类型:

one *pob = &ob;  // a one pointer can point to a two object 
pob->show();     // but this will invoke one::show()

如果您希望根据对象的实际类型调用正确的函数,而不是根据类型声明假定的类型,则需要使用虚函数并覆盖它们:

class one
    ... (the rest as before) ...
    virtual void show();
;

class two:public one

    ... (the rest as before) ...
    void show() override;  
;

然后,每当您调用 show() 时,都会调用正确的函数 (online example),除非您使用完全限定标识符明确指定了一个精确指定的版本。

【讨论】:

以上是关于继承中的函数定义的主要内容,如果未能解决你的问题,请参考以下文章

C++之多态总结(多态的定义及实现,抽象类,多态原理,单继承,多继承中的虚函数表)

scala入门教程:scala中的面向对象定义类,构造函数,继承

多重继承纯基函数

hive自定义UDTF函数,步骤讲解

从 reverse_iterator 中的用户定义的迭代器继承所有函数

C++--多态