设为首页 加入收藏

TOP

C++之易混淆知识点五
2015-07-24 06:13:06 来源: 作者: 【 】 浏览:25
Tags:混淆 知识点
、解析类继承中父类与子类之间成员的访问可见度:
?
? ? 外部可见度:指的是被子类继承的父类成员在子类的外部访问控制度,有protected、public、private。
?
? ? 内部可见度:指的是被子类继承的父类成员在子类定义的方法中的内部访问控制度,有可访问(Y)、不可访问(N)。
?
?
?
class A
{?
? ? private:
? ? ? ? void pvA();
?
? ? protected:
? ? ? ? void ptA()
? ? public:
? ? ? ? void pbA();
? ? ? ? ?....
}
?
class B:public A
{
?
? ? ? void func()
?
? ? ? {
?
? ? ? ? ? ?pvA(); ?//error
?
? ? ? ? ? ?ptA(); ? //ok
?
? ? ? ? ? ?pbA(); ?//ok
?
? ? ? }
?
? ? ? ? ?....
}
?
void g( B &b)
?
? ? ? {
?
? ? ? ? ? ?b.pvA(); ?//error
?
? ? ? ? ? ?b.ptA(); ? //error
?
? ? ? ? ? ?b.pbA(); ?//ok
?
? ? ? }
?
class B:protected A
{
?
? ? ? void func()
?
? ? ? {
?
? ? ? ? ? ?pvA(); ?//error
?
? ? ? ? ? ?ptA(); ? //ok
?
? ? ? ? ? ?pbA(); ?//ok
?
? ? ? }
?
? ? ? ? ?....
}
?
void g( B &b)
?
? ? ? {
?
? ? ? ? ? ?b.pvA(); ?//error
?
? ? ? ? ? ?b.ptA(); ? //error
?
? ? ? ? ? ?b.pbA(); ?//error
?
? ? ? }
?
class B:private A
{
?
? ? ? void func()
?
? ? ? {
?
? ? ? ? ? ?pvA(); ?//error
?
? ? ? ? ? ?ptA(); ? //ok
?
? ? ? ? ? ?pbA(); ?//ok
?
? ? ? }
?
? ? ? ? ?....
}
?
void g( B &b)
?
? ? ? {
?
? ? ? ? ? ?b.pvA(); ?//error
?
? ? ? ? ? ?b.ptA(); ? //error
?
? ? ? ? ? ?b.pbA(); ?//error
?
? ? ? }
?
二、类的构造函数中调用虚方法会怎么样:
?
? ? ? 构造函数中调用了虚方法将导致运行时错误。原因是:当父类的构造函数被调用的时候,此时子类的构造函数还没有被调用,但是由于父类的构造函数中调用了虚方法,根据虚方法的实现机制,父类调用的虚方法是定义在子类中的,也就是说在此期间调用的virtual函数下降到子类阶层中,而子类的函数要使用子类的成员变量,而此时子类的成员变量还没有被初始化,这就意味着调用了一个还没有完成构造的类型对象的方法,于是就出现了调用错误。
?
? ? ?顺便提一下:当一个类型被构造的时候,其构造顺序是:先执行成员变量的初始化表达式,然后执行父类的构造函数,最后调用类型自己的构造方法。
?
?
?
三、内存中分配引用类型的实质:
?
? ? 首先在堆栈上分配一个引用对象,在堆上分配一个对象实例,然后使得堆栈上的引用对象指向堆上的对象实例。
?
例如:
?
class person
{?
? ? private:
? ? ? ? char *name;
? ? ? ? int age;
? ? public:
? ? ? ? person(char *s,int n):name(s),age(n){}
? ? ? ? ?....
}
?
person a=new person("Tom",24);
person b=a; ?//设计到深浅拷贝的问题
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇poj 3150 Cellular Automaton(矩.. 下一篇POJ 3664 Election Time 题解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: