11.4 派生类添加函数

面向对象编程的三大特性:封装、继承和多态。
派生类可以继承父类的特性,但是有时候每个派生类都有可能有自己的需求。这个时候就需要继承完往派生类里面添加需要的函数。

访问说明符不在类之间进行继承。

比如:

#include <iostream>
 
class Base
{
protected:
    int m_value;
 
public:
    Base(int value)
        : m_value(value)
    {
    }
 
    void identify() { std::cout << "I am a Base\n"; }
};

对于派生类,里面添加getValue()函数。

class Derived: public Base
{
public:
    Derived(int value)
        :Base(value)
    {
    }
 
    int getValue() { return m_value; }
};
特殊情况:覆盖父类的函数

直接覆盖就行,这也派生类对该函数调用时就不会调用父类函数了。

class Base
{
protected:
    int m_value;
 
public:
    Base(int value)
        : m_value(value)
    {
    }
 
    void identify() { std::cout << "I am a Base\n"; }
};
 
class Derived: public Base
{
public:
    Derived(int value)
        : Base(value)
    {
    }
 
    int getValue() { return m_value; }
 
    // Here's our modified function
    void identify() { std::cout << "I am a Derived\n"; }
};
int main()
{
    Base base(5);
    base.identify();
 
    Derived derived(7);
    derived.identify();
 
    return 0;
}

11.5 多重继承

多重继承:派生类可以从多个父类继承成员。
比如一个老师,她既是老师,又同时是员工,有多重属性。
多重继承语法:只需指定每个基类(就像在单个继承中一样),并用逗号分隔即可。

事实证明,使用多重继承可以解决的大多数问题也可以使用单一继承来解决。许多面向对象的语言(例如Smalltalk,PHP)甚至都不支持多重继承。许多相对现代的语言(例如Java和C#)将类限制为普通类的单一继承,但允许接口类为多重继承(我们将在后面讨论)。禁止在这些语言中进行多重继承的背后驱动思想是,它只会使语言变得过于复杂,并最终导致更多的问题而不是解决。
许多作者和经验丰富的程序员认为,由于C ++带来的许多潜在问题,应该不惜一切代价避免C ++的多重继承。您的作者不同意这种方法,因为在某些情况下,多重继承是进行继承的最佳方法。但是,应极其谨慎地使用多重继承。

多重继承示例:

#include <string>
 
class Person
{
};
 
class Employee
{
};
 
// Teacher publicly inherits Person and Employee
class Teacher: public Person, public Employee
{
};

如果继承的两个基类中都含有相同名称的函数,那么派生类在使用的时候该怎么办?通过加上命名空间,显示指定要使用的类。把重复的函数getID变成USBDevice::getID()去调用。

#include <iostream>
 
class USBDevice
{
	...
    long getID() { return m_id; }
};
 
class NetworkDevice
{
	...
    long getID() { return m_id; }
};
 
class WirelessAdapter: public USBDevice, public NetworkDevice
{
public:
    WirelessAdapter(long usbId, long networkId)
        : USBDevice(usbId), NetworkDevice(networkId)
    {
    }
};
 
int main()
{
    WirelessAdapter c54G(5442, 181742);
    std::cout << c54G.USBDevice::getID(); // Which getID() do we call?
 
    return 0;
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐