C++类的继承要点:
- 派生类不能直接访问基类的私有成员变量,只能通过基类的公有或保护方法进行访问。
- 创建派生类对象时必须先创建基类对象,结合上条就是说,派生类的构造函数必须调用基类的构造函数,若没显示调用,则程序将使用默认的基类构造函数。
- 基类指针可以在不进行显示类型转换的情况下指向派生类对象;基类引用可以在不进行显示类型转换的情况下引用派生类对象;然而基类指针或引用不能调用派生类的方法。
- 派生类指针可以调用基类方法,当派生类和基类存在同名方法时默认调用派生类方法,可以添加类作用域指定调用基类的同名方法。
c++ virtual关键字
虚函数的主要作用就是显示的声明基类中的函数可以在派生类中重新定义,也就是说只有成员函数才能被申明为虚函数。并且如果方法是通过引用或指针而不是对象直接调用的话,它还将确定使用哪种方法。
虚函数要点:
- 构造函数不能是虚函数;基类析构函数应当是虚析构函数,即使它不执行任何操作。
- 方法在基类中声明为虚函数之后,它在派生类中就自动成为虚函数。
- 没有
virtual
关键字,程序将根据引用类型或指针类型选择方法;使用virtual
关键字后程序将根据引用或指针指向对象的类型来选择方法。
protected访问控制
作为类的访问控制符,protected
和private
的作用类似,在类外都表示只能用公有类成员的方法来访问protected
部分的数据成员,他们两个区别只有在基类派生的类中才会表现出来。派生类可以直接访问基类中的protected
的数据成员,而无法访问private
的数据成员。因此,对于类外来说,protected
的作用的和private
的作用类似,对于派生类来说,protected
的作用的public
的作用类似。
举例说明
#include<iostream>
class A
{
public:
explicit A(int i=10):d(i) { std::cout << " class A " << std::endl;}
void fuck()
{
std::cout << " the class A fuck c++ " << std::endl;
}
private:
int d;
};
class B : public A
{
public:
B(){std::cout << " default class b " << std::endl;}
explicit B(int i):A(i) { std::cout << " class b " << std::endl;}
void fuck()
{
std::cout << " the class B fuck c++ " << std::endl;
}
void print()
{
std::cout << " derived func " << std::endl;
// std::cout << " the base class data number: " << d << std::endl; // error: 第一条
}
};
int main()
{
A* pf1 = new B; // class A -> default class b : 第二条,第三条
pf1->fuck(); // the class A fuck c++
//pf1->print(); // error: 第三条
B* pf2 = new B(100);
pf2->fuck(); // the class B fuck c++
pf2->A::fuck(); // the class A fuck c++
return 0;
}
例如对于没有加virtual
的fuck方法而言,上面的程序有下面的输出:
int main()
{
A aa;
B bb(100);
A& a1_ref = aa;
A& a2_ref = bb;
a1_ref.fuck(); // the class A fuck c++
a2_ref.fuck(); // the class A fuck c++
return 0;
}
而如果fuck方法加了关键字virtual
则:
A& a1_ref = aa;
A& a2_ref = bb;
a1_ref.fuck(); // the class A fuck c++
a2_ref.fuck(); // the class B fuck c++
网友评论