基类的protected可以被其派生类访问,派生类protected不能被其基类访问
没有继承的时候,类只有两种用户:类本身和该类的用户有了继承之后,有了第三种用户,用类派生新类的程序员,这时候,如果基类中需要让派生类访问,但不让外界访问的这种权限,就叫protected
经过继承后权限的变化
派生类定义方法:
Class classname: ccess-lable base-class#include <iostream>
#include <complex>
using namespace std;
class Base
{
public:
virtual void a(int x) { cout << "Base::a(int)" << endl; }
// overload the Base::a(int) function
virtual void a(double x) { cout << "Base::a(double)" << endl; }
virtual void b(int x) { cout << "Base::b(int)" << endl; }
void c(int x) { cout << "Base::c(int)" << endl; }
};
class Derived : public Base
{
public:
// redefine the Base::a() function
void a(complex<double> x) { cout << "Derived::a(complex)" << endl; }
// override the Base::b(int) function
void b(int x) { cout << "Derived::b(int)" << endl; }
// redefine the Base::c() function
void c(int x) { cout << "Derived::c(int)" << endl; }
};1、重载也可以出现在基类和子类之间,需要子类显示注明基类的函数
2、重写是针对基类中有virtual关键字的函数,子类可以不加virtual关键字,但是这个重写的函数仍然是虚函数。
3、派生类中虚函数的声明必须与机类中的定义方式完全匹配。但有一个例外,返回对基类的引用(或指针)的虚函数。派生类中的虚函数可以返回 基类函数所返回类型的派生类的引用(或指针)。
定义为virtual的函数是基类期待派生类对象重新定义的,基类希望派生类继承的函数不能定义为虚函数。
存在派生类型引用到基类类型引用的自动转换,反之则不存在
关于virtual关键字
子类中强制覆盖虚函数机制
引用转换不同于对象转换
基类构造函数:
派生类构造函数:首先初始化基类,然后根据声明次序初始化派生类的成员。(只能初始化直接基类)
派生类调用基类的构造函数和
#include <iostream.h>
class animal
{
public:
animal(int height, int weight)
{
cout<<"animal construct"<<endl;
}
…
};
class fish:public animal
{
public:
fish():animal(400,300)
{
cout<<"fish construct"<<endl;
}
…
};
void main()
{
fish fh;
}
一旦类定义了自己的接口,与该类对象所有交互都应该通过该接口。与基类成员同名的派生类成员将屏蔽对基类成员的直接访问。
虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。
二、构造函数中赋值和初始化列表
class CExample
{
public:
int a;
float b;
//构造函数初始化列表
CExample(): a(0),b(8.8)
{}
//构造函数内部赋值
CExample()
{
a=0;
b=8.8;
}
};现在我们来看构造函数中冒号初始化和函数初始化的问题,类构造函数的作用是创建一个类的对象时,调用它来构造这个类对象的数据成员,一要给出此数据成员分配内存空间,二是要给函数数据成员初始化,构造数据成员是按数据成员在类中声明的顺序进行构造。class student
{
public :
student ()
protected:
const int a;
int &b;
}
student ::student (int i,int j)
{
a=i;
b=j;
}在Student类中有两个数据成员,一个是常量数据成员,一个是引用数据成员,并且在构造函数中初始化了这两个数据成员,但是这并不能通过编译,因为常量初始化时必须赋值,它的值是不能再改变的,与常量一样引用初始化也需要赋值,定义了引用后,它就和引用的目标维系在了一起,也是不能再被赋值的。所以C
++":"后初始化的机制,使引用和常量数据成员变为可能的,Student类的构造函数应为:class teach
{
public :
teach(char *p="name",int a=0)
protected:
char name[30];
int age;
}
teach::teach(char*p,int a)
{
strcopy(name ,p);
age=a;
cout>>name>>endl;
}
class student
{
public:
student (char *p="name");
protected;
char name[30];
teach teacher;
};
student::student(char *p)
{
strcopy(name,p);
cont>>name>>endl;
} 在上面的程序中通不过编译,编译系统会告诉你teacher这个类对象缺默认构造函数,因为在teach 类中没有定义默认的构造函数。那么带参数的构造函数怎么进行构造呢?通过我们前面提到的冒号赋值。那它的构造函数应该是:3、 http://jodonchu.blog.51cto.com/3822410/1085831
4、http://www.cnblogs.com/BlueTzar/articles/1223169.html
5、http://www.cppblog.com/luyulaile/archive/2011/02/14/140059.html
原文:http://blog.csdn.net/xiantian7/article/details/22570629