Effective C++学习笔记(3)

继承与面向对象设计

1、如果继承一个基类,派生类重定义或覆写了一些基类成员函数,但是在调用的时候,又希望那部分被覆盖的基类成员函数可被使用,那么就必须为原本会被覆盖的名称引用using的声明式。

class Base
{
private: 
	int x;
public:
	virtual void f1() = 0;
	virtual void f1(int);
	void f2();
	void f2(double);
};
class Derived: public Base
{
	public:
		using Base::f1;//让Base class内名为f1和f2的所有东西
		using Base::f2;//在Derived作用域内都可见(并且public)
		virtual void f1();
		void f2();
};

//调用时
Derived d;
int x;
d.f1(); //调用Derived::f1
d.f1(x);//调用Base::f1
d.f2();//调用derived::f2
d.f2(x);//调用Base::f2

或者可以使用转交函数

class Base
{
private: 
	int x;
public:
	virtual void f1()=0;
	virtual void f1(int);
	void f2(double);
};
class Derived: private Base
{
	public:
		virtual void f1()
		{
			Base::f1();//此时会去调基类的f1()
		}
		void f2();
};

注意几个概念:
覆写:派生类函数(重写)基类函数。范围不同,分别位于基类和派生类。它们的函数名相同、参数相同、返回类型相同。
重载:在一个类中制造几个名称相同的成员函数,但是参数形式不同。如果一个重载的函数前有virtual修饰符,这不会影响它的重载身份。
重定义:派生类对基类的成员函数重新定义,它们函数名相同,其他无要求。作用域不同,分别位于基类和派生类。

发布了8 篇原创文章 · 获赞 3 · 访问量 179

猜你喜欢

转载自blog.csdn.net/Longstar_L/article/details/105296573