社区
C++ 语言
帖子详情
如何在子类中改写父类中的virtual函数?
vn68214
2007-05-30 09:47:50
class base
{
public:
virtual base* clone()
{
return this;
}
};
class sub: public base
{
public:
virtual sub* clone()
{
return this;
}
};
我想用clone分别返回子类和父类的指针
...全文
364
16
打赏
收藏
如何在子类中改写父类中的virtual函数?
class base { public: virtual base* clone() { return this; } }; class sub: public base { public: virtual sub* clone() { return this; } }; 我想用clone分别返回子类和父类的指针
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
taodm
2007-05-31
打赏
举报
回复
哎,我在csdn做的最多的一件事就是让人扔了VC6
一直在想,是不是应该版主发个置顶贴了。
xuejinn
2007-05-31
打赏
举报
回复
mark
zycy
2007-05-31
打赏
举报
回复
偶在vc2005下一点儿问题都没有
int main()
{
base* bp=new base();
sub* sp=new sub();
long i=(long)bp->clone();
long j=(long)sp->clone();
bp=sp;
long k=(long)bp->clone();
return 0;
}
完全正常执行
Vitin
2007-05-30
打赏
举报
回复
此外,clone是否返回一个新的对象,是由类设计者决定的,要看设计期望的语义是什么。因此,不能说LZ的设计就是错的。
返回值协变是面向对象中比较新的发展,在98年的C++标准中通过。VC6等在包括这一点在内的许多方面都没能全面支持98标准,有技术原因(修改比较困难...),有成本原因(已经开发很长时间了...),也有商业原因(不能落后于对手...)。总之从VC6上得到的,可能与C++标准南辕北辙。要用VC系列,还是用VC8吧,98版C++标准的新特性,几乎都支持了。
Vitin
2007-05-30
打赏
举报
回复
其实C++标准是支持虚函数的返回值协变的,但是早期的一些编译器(如VC6)还没有做到这一点,所以报错了;而现在有很多编译器(如VS2005中的VC8)已经支持它了,因此LZ的程序在VC8上是没有语法问题的。
返回值协变是指派生类的返回值可以是基类的返回值的一个派生类。如:
C* A::fun();
D* B::fun();
B是A的派生类,D是C的派生类,则A::fun可以定义为虚函数,且B::fun有效地覆盖(Override)A::fun。
canybox
2007-05-30
打赏
举报
回复
virtual base* clone()
与virtual sub* clone()
你的子类函数不要更改返回类型.
其实这种情况你子类可以不用重载,只要实际类型不同函数自然定位在相应的继承体系.
lightnut
2007-05-30
打赏
举报
回复
//完整的例子, VC2005编译运行通过
#include <iostream>
class base
{
public:
base() {}
base (base const& other){}
virtual ~base(){}
virtual base* clone() const
{
return new base(*this);
}
};
class sub: public base
{
public:
sub() {}
sub(sub const& other)
:base(other){}
virtual ~sub(){}
virtual sub* clone() const
{
return new sub(*this);
}
};
int main()
{
using namespace std;
base *pb;
sub s;
pb=&s;
cout<<(typeid(*pb).name())<<endl;
base b;
pb=&b;
cout<<(typeid(*pb).name())<<endl;
system("pause");
return 0;
}
vn68214
2007-05-30
打赏
举报
回复
base *pb;
sub s;
pb=&s;
cout<<(typeid(*pb).name())<<endl;
base b;
pb=&b;
cout<<(typeid(*pb).name())<<endl;
这样测试
vn68214
2007-05-30
打赏
举报
回复
c:\documents and settings\vn\桌面\cpp3.cpp(65) : error C2555: 'sub::clone' : overriding virtual function differs from 'base::clone' only by return type or calling convention
还是有错啊,就是原来那个错
lightnut
2007-05-30
打赏
举报
回复
人家这个是在实现Prototype模式呀:)
珍惜生命远离CPP
2007-05-30
打赏
举报
回复
你先说说你想怎么使用这样的接口吧
lightnut
2007-05-30
打赏
举报
回复
//class sub 错误:)
class sub: public base
{
public:
sub(sub const& other)
:base(other){}
virtual sub* clone() const
{
return new sub(*this);
}
};
lightnut
2007-05-30
打赏
举报
回复
class base
{
public:
base (base const& other){}
virtual base* clone() const
{
return new base(*this);
}
};
class sub: public base
{
public:
sub(sub const& other)
:base(other){}
virtual sub* clone() const
{
return new sub(this);
}
};
vn68214
2007-05-30
打赏
举报
回复
但是父类就不能调用了啊
珍惜生命远离CPP
2007-05-30
打赏
举报
回复
设计上错误,不应该使用虚函数,只需要一个子类的函数就可以了,返回子类的this指针
vn68214
2007-05-30
打赏
举报
回复
但是不能通过编译,我哪里不对?或者有没有别的办法?
c++继承
父类
的
子类
,如何调用
父类
的同名
函数
?
https://blog.csdn.net/qq_26399665/article/details/52080215
子类
调用
父类
的同名
函数
:
子类
和
父类
返回值参数相同,
函数
名相同,有
virtual
关键字,则由对象的类型决定调用哪个
函数
。
子类
和
父类
只要
函数
名相同,没有
virtual
关键字,则
子类
的对象没有办法调用到
父类
的同名
函数
,
父类
的同名
函数
被隐藏了,也可以强制调用
父类
的同名
函数
c...
子类
继承
父类
虚
函数
//实现多态的三个条件 //1 要有继承 //2 要有虚
函数
重写 //3 用
父类
指针(
父类
引用)指向
子类
对象 //c++规定,当一个成员
函数
被声明为虚
函数
后,其派生类
中
的同名
函数
都自动成为虚
函数
。因此,在
子类
重新声明该虚
函数
时,可以加,也可以不加,但习惯上每一层声明
函数
时都加
virtual
,使程序更加清晰。 成员
函数
被重载的特征是: (1)具有相同的作用域(即同一个类定义
中
); ...
c++
父类
虚
函数
被
子类
虚
函数
覆盖后,如何直接调用
父类
的虚
函数
?
研究过虚
函数
表的人都知道c++的多态是来自于虚
函数
表的
函数
指针覆盖,那么
子类
的虚
函数
指针覆盖了虚
函数
表
中
相应位置的
父类
虚
函数
指针后,那是怎么调用
父类
的虚
函数
的呢?即有如下继承关系:class fa{ public:
virtual
void show(){cout << "fa" << endl;} }; class son : public fa{ publi...
C++笔记
在父
子类
中
,当
子类
覆盖了
父类
的同名虚
函数
,然后用
父类
指针或引用访问虚
函数
时,它既可能调用
父类
的虚
函数
,也可能调用
子类
的同名
函数
,具体调用哪个取决于该
父类
指针或引用。构造
函数
不能设置为虚
函数
,假如构造
函数
可以设置为虚
函数
,
子类
的构造
函数
会自动覆盖
父类
的构造
函数
,当创建
子类
对象时,
子类
执行自己的构造
函数
之前先执行
父类
的构造
函数
,但是。6、在执行
子类
的构造
函数
时,会按照继承表
中
的顺序执行
父类
的构造
函数
,默认执行的是
父类
的无参构造,可以在
子类
的构造
函数
的初始化列表
中
显示地调用
父类
的有参构造,最后才执行
子类
的。
c++
中
子类
重写
父类
虚
函数
剖析C++
中
子类
重写
父类
虚
函数
的底层实现
C++ 语言
64,646
社区成员
250,476
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章