您的位置:首页 > 其它

指向对象的指针的函数调用问题(含虚函数和纯虚函数知识)

2016-09-02 11:09 323 查看
首先是没有涉及虚函数的情况:
对象指针不能指向父类对象
执行同样的函数talk,选择执行指针所指定的talk
例如B *pb,则pb只能指向B或者子类对象,执行相同函数时只执行B的talk</pre></p><p><pre name="code" class="cpp">#include<iostream>
#include<cmath>

using namespace std;

class A{
public:
void talk()
{
cout<<"This is A"<<endl;
}
};

class B:public A
{
public:
void talk()
{
cout<<"This is B"<<endl;
}
};

class C:public B
{
public:
void talk()
{
cout<<"This is C"<<endl;
}
};
class D:public C
{
public:
void talk()
{
cout<<"This is D"<<endl;
}
};
int main(){
A a;
B b;
C c;
D d;
B *pb;

//pb=&a; (Error!!)
//pb->talk();

pb=&b; //执行B的talk
pb->talk();

pb=&c; //依旧执行B的talk
pb->talk();

pb=&d; //依旧执行B的talk
pb->talk();

a.talk(); //这里只调用他们自己的
b.talk();
c.talk();
d.talk();

//对象指针不能指向父类对象
//执行同样的函数talk,选择执行指针所指定的talk
//例如B *pb,则pb只能指向B或者子类对象,执行相同函数时只执行B的talk

}

然后是涉及虚函数的情况,如果父类中的那个talk是虚函数,则选择调用当前指向的类对象
#include<iostream>

using namespace std;
class A{
public:
void talk()
{
cout<<"This is A"<<endl;
}
};

class B:public A
{
public:
virtual void talk() //虚函数talk
{
cout<<"This is B"<<endl;
}
};

class C:public B //C继承B
{
public:
void talk()
{
cout<<"This is C"<<endl;
}
};
class D:public B //D继承B
{
public:
void talk()
{
cout<<"This is D"<<endl;
}
};

class E:public D //E继承D,相当于继承B
{
public:
void talk()
{
cout<<"This is E"<<endl;
}
};
int main(){
A a;
B b;
C c;
D d;
E e;
B *pb;

//pb=&a; (Error!!) //依旧不能指向父类
//pb->talk();

pb=&b; //执行B的talk
pb->talk();

pb=&c; //执行C的talk
pb->talk();

pb=&d; //执行D的talk
pb->talk();

pb=&e; //执行D的talk
pb->talk();

}



纯虚函数:定义的时候,不写纯虚函数的实现,  同时这个类被称作抽象类,不能被实例化
virtual void talk()=0;

继承抽象类的派生类,必须对纯虚函数进行实现,否则会报错(如果没加纯虚,则可以不实现的)
#include<iostream>

using namespace std;

class A
{
public:
void talk();
};

class B:public A
{
public:
virtual void talk()=0; //纯虚函数talk

};

class C:public B //C继承B
{
public:
void talk()
{
cout<<"This is C"<<endl;
}
};

class D:public B //D继承B
{
public:

void talk()
{
cout<<"This is D"<<endl;
}
};

class E:public D //E继承D,相当于继承B
{
public:
void talk()
{
cout<<"This is E"<<endl;
}
};

int main(){
A a;
//B b; (Error!)抽象类不可实例化,指针也不行
C c;
D d;
E e;
c.talk();
d.talk();
e.talk();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐