请大侠解决问题:type a 于type *a = new type();的不同表现

royalty 2003-11-18 06:24:36
我有一段代码如下:
////Base.h
class Base
{
public:
Base(int x):_x(x){};
virtual void print();
private:
int _x;
};
////Base.cpp
void Base::print()
{
cout<<"x = "<<_x<<endl;
}
////Derived.h
class Derived :public Base
{
public:
Derived(int y):Base(y),_y(y){};
virtual void print();
private:
int _y;
}

///////Derived.cpp
void Derived::print()
{
Base::print();
cout<<"y = "<<_y<<endl;
}
//////main.cpp

int main()
{
Base d1 = Derived(1);
Base *d2 = new Derived(0);
d1.print();
d2->print();
}

运行结果是:
x=1
x=0
y=0
为什么不是
x=1
y=1
x=0
y=0
这两种调用有什么不同?
...全文
62 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qufan 2003-11-18
  • 打赏
  • 举报
回复
基类的指针可是指向派生类的对象,但是好像只有派生类的对象可以赋给基类的对象
基类的对象不能赋给派生类的对象
leyt 2003-11-18
  • 打赏
  • 举报
回复
大多数C++的书上都能找到答案的。比如《C++ PRIMER》
alandd 2003-11-18
  • 打赏
  • 举报
回复
d1.print();//此处调用是调用Base::print()所以只会打印出
x=1
d2->print();//此处调用是调用Derived::print(),所以会打印出
x=0
y=0

原因就是:虽然函数print()是virtual的,但是通过对象(非指针)去调用的时候,只会调用自己本身的函数,例如d1为base类型,则就只会调用base::print(),当通过指针去调用的时候,就会产生多态的行为,所以调用的是 Derived::print()(关于多态就不详述了)

leyt 2003-11-18
  • 打赏
  • 举报
回复
透过虚拟函数, 衍生类可重新定义基类的成员函数。
虚函数的用处
针对共享相同基类的那些对象, 可有较一致的使用态度, 例如, 你可能定义一个名为Shape且带有一 个Draw虚拟成员函数的基类, 然后从它派生了Circle类和Square类, 而且它们各自带有自己的Draw成员函数.从这些类派生建立的每个对象都可呼叫Draw成员函数; 但是编译程式可确保各自应呼叫那个版本的Draw 函数.是基类的还是派生类的。

一个例子

重要观念: 指向父类的指针也可用来指向子类别

#include <iostream.h>
class BaseClass
{
public:
virtual void Display( ) { cout << 100 << "\n"; }
};
class DerivedClass: public BaseClass
{
public:
virtual void Display( ) { cout << 200 << "\n"; }
};
void Print(BaseClass* pbc)
{ pbc->Display( ); }
int main( )
{ BaseClass* pbc = new BaseClass;
DerivedClass* pdc = new DerivedClass;
Print(pbc);//显示 100
Print(pdc);//显示 200
return 0;
}

V-table (Virtual function table)
当C++程式呼叫非虚函数, 采用与C程式呼叫函数所用方式一样的静态绑定来呼叫函数. 但是C++程式 若是透过指向类别的指针来呼叫虚函数时, 编译程式则采用所谓的晚期绑定(late binding)或静态绑定 (static binding)技术来呼叫函数.
而C++虚函数用虚函数表(virtual function table), 或称V-表来实作动态绑定, 所谓的V-表是一 个函数指针的阵列, 这是编译程序替每个使用虚函数的类所建制的。
sportok 2003-11-18
  • 打赏
  • 举报
回复
Base d1 = Derived(1);
你可以理解为Base d1 = (Base)Derived(1);(当然,不要这么写)
Base d1决定d1还是Base类型的

Base *d2 = new Derived(0);
同样位置的Base只能说明
d2是指向Base类型的指针
而实际上*d2是Derived类型的

所以
d1.print();执行Base的Print
d2->print();执行Derived的Print

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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