关于继承

guzhilei1986 2008-10-15 10:01:22
请教几个关于继承的问题。

比如如何初始化子类,
另外还有虚函数的继承问题,
子类的一个对象到底是如何在调用虚函数等
...全文
114 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
guzhilei1986 2008-10-20
  • 打赏
  • 举报
回复
谢谢给位
shanpobaiyang 2008-10-15
  • 打赏
  • 举报
回复
刚才写错了一个单词是virtual不是viture
xiehuanqing10 2008-10-15
  • 打赏
  • 举报
回复
初始化子类就是在构造函数的参数中初始化
shanpobaiyang 2008-10-15
  • 打赏
  • 举报
回复
class A
{
public:
A(int aa=0,int bb=0){a=aa,b=bb;}
viture void F(){}
private:
int a,b;
};

class B:public A
{
public:
B(double cc=0,int aa,int bb):A(int aa,int bb){c=cc;}
private:
double c;
};
int main()
{
A(1,2);
B(1,2,3);
return 0;
}

至于虚函数,子类中如果没有对该虚函数重载,那么当用子类调用该函数时就会调用基类中定义的虚函数,如果子类中定义了虚函数,就调用子类中的,当然也可以显式的调用,如果子类对该函数重载了,可以加上定义域解析运算符“:”来调用
机智的呆呆 2008-10-15
  • 打赏
  • 举报
回复
看 深入探索C++对象模型
Vegertar 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lanmaozi 的回复:]
子类的一个对象到底是如何在调用虚函数

其实编译器会把虚函数的地址放在一个叫做VTABLE的表内。
当你把一个函数声明为虚函数时候,编译器会在你的类结构里加上一个指针, 这个指针指向刚才那个VTABLE.
vTABLE中包含类中所有的虚函数的地址,包括基类的。
如果子类重新实现了基类虚函数,那么VTABLE会将该虚函数的地址置为子类中虚函数的地址,否则,VTALBE内存放的是基类中改虚函数的地址。
子类对象调用虚函数就是在…
[/Quote]
UP.
补充下:
对于虚函数的调用是由编译器根据虚指针在虚表中的偏移来决定的,指针的偏移范围是固定的,它永远在基类中虚表所限定的范围内,如果派生类新定义了一个新的(不是重定义)虚函数,那么它在基类的虚表中不存在,则基类指针就无法调用。

base vtable derive vtable
vptr --> | f() | | f() |
| g() | | g() |
------------------ | h() |
| i() | vptr只能偏移两个指针位,所以派生类中新定义的虚函数h(),i()
不能调用。
anythingother 2008-10-15
  • 打赏
  • 举报
回复
一个类的初始化包括三步
举例:显式的创建一个类对象A a=new A();
第一:加载类A(.class文件)到内存中 ;第二:静态初始化(static修饰的部分) ;第三:动态初始化(先初始化属性 再调用构造方法创造对象)
通常将第一步 第二步合在一起统称静态初始化 也就是 ,第一步:加载类到内存中,静态初始化(static修饰的部分)(注意 不管创造几个对象第一步只做一次)
第二步:动态初始化(先初始化属性 再用构造方法创造对象)
第一步相对于Class.forName("packagename.A");
第二步相当于Class.forName("packagename.Child").newInstance();

虚函数(virtual function)是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。

#i nclude "stdio.h"

#i nclude "conio.h"



class Parent

{

public:

char data[20];

void Function1();

virtual void Function2(); // 这里声明Function2是虚函数

}parent;

void Parent::Function1()

{

printf("This is parent,function1\n");

}

void Parent::Function2()

{

printf("This is parent,function2\n");

}



class Child:public Parent

{

void Function1();

void Function2();

} child;

void Child::Function1()

{

printf("This is child,function1\n");

}

void Child::Function2()

{

printf("This is child,function2\n");

}



int main(int argc, char* argv[])

{

Parent *p; // 定义一个基类指针

if(_getch()=='c') // 如果输入一个小写字母c

p=&child; // 指向继承类对象

else

p=&parent; // 否则指向基类对象

p->Function1(); // 这里在编译时会直接给出Parent::Function1()的

入口地址。

p->Function2(); // 注意这里,执行的是哪一个Function2?

return 0;

}
程序中仅仅调用了一个Function2()函数,却可以根据用户的输入自动决定到底调用基类中的Function2还是继承类中的Function2,这就是虚函数的作用。
lanmaozi 2008-10-15
  • 打赏
  • 举报
回复
子类的一个对象到底是如何在调用虚函数

其实编译器会把虚函数的地址放在一个叫做VTABLE的表内。
当你把一个函数声明为虚函数时候,编译器会在你的类结构里加上一个指针, 这个指针指向刚才那个VTABLE.
vTABLE中包含类中所有的虚函数的地址,包括基类的。
如果子类重新实现了基类虚函数,那么VTABLE会将该虚函数的地址置为子类中虚函数的地址,否则,VTALBE内存放的是基类中改虚函数的地址。
子类对象调用虚函数就是在调用指向VTABLE的指针(VPTR)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧