繁体   English   中英

关于C ++继承

[英]Regarding C++ Inheritance

我只是想知道。 如果派生类使用公共继承从基类继承,并且还重新定义了基类公共成员函数之一,例如,如果派生类的实例调用print(),则编译器将使用哪一个? 打印是在基类中定义的,而在派生类中是重新定义的吗? 非常感谢你!!

通过在派生类中重新定义基类成员函数,新定义将隐藏旧定义。

因此,在派生类的范围内,只能看到新的定义。

class Base
{
public:
  void print() { std::cout << "b \n"; }
};

class Derived : public Base
{
public:
  void print() { std::cout << "d \n"; }
};

int main(void)
{
  Base b;
  Derived d;
  Base *pb = &d;
  Derived *pd = &d;

  b.print(); // Calls Base::print()
  d.print(); // Calls Derived::print()
  pb->print(); // Calls Base::print()
  pd->print(); // Calls Derived::print()

  getchar();
  return 0;
}

编译器使用对象的静态类型来确定要调用的函数。 任何名称(包括在派生类中声明的成员函数)都将在基类中隐藏具有相同名称的声明。

例如

#include <iostream>
#include <string>

class Base
{
public:
    Base() : data( 10 ) {}
    void f( char ) { std::cout << "Base::f( char )" << std::endl; }
    void f( int ) { std::cout << "Base::f( int )" << std::endl; }
    int data;
};

class Derived : public Base
{
public:
    Derived() : data( "Hello World!" ) {}
    void f( double ) { std::cout << "Derived::f( double )" << std::endl; }
    std::string data;
};

int main() 
{
    Base b;
    b.f( 0 );
    b.f( 'A' );
    std::cout << b.data << std::endl;

    std::cout << std::endl;

    Derived d;
    d.f( 0 );
    d.f( 'A' );
    std::cout << d.data << std::endl;

    std::cout << std::endl;

    Base *pb = new Derived;
    pb->f( 0 );
    pb->f( 'A' );
    std::cout << pb->data << std::endl;

    delete pb;

    return 0;
}

程序输出为

Base::f( int )
Base::f( char )
10

Derived::f( double )
Derived::f( double )
Hello World!

Base::f( int )
Base::f( char )
10

使用虚拟函数而不是非虚拟函数可以提供多态性。

例如

#include <iostream>
#include <string>

class Base
{
public:
    Base() : data( 10 ) {}
    virtual ~Base() {}
    virtual void print() const { std::cout << data << std::endl; }
    int data;
};

class Derived : public Base
{
public:
    Derived() : data( "Hello World!" ) {}
    void print() const 
    {
        Base::print();
        std::cout << data << std::endl; 
    }
    std::string data;
};

int main() 
{
    Base b;
    b.print();

    std::cout << std::endl;

    Derived d;
    d.print();
    std::cout << std::endl;

    Base *pb = new Derived;
    pb->print();

    delete pb;

    return 0;
}

程序输出为

10

10
Hello World!

10
Hello World!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM