Learn C++学习笔记:第十一章—向派生类中添加功能、多重继承
11.4 派生类添加函数面向对象编程的三大特性:封装、继承和多态。派生类可以继承父类的特性,但是有时候每个派生类都有可能有自己的需求。这个时候就需要继承完往派生类里面添加需要的函数。访问说明符不在类之间进行继承。比如:#include <iostream>class Base{protected:int m_value;public:B...
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;
}
更多推荐
所有评论(0)