Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >有没有办法通过指向基类的指针来复制派生类对象?

有没有办法通过指向基类的指针来复制派生类对象?
EN

Stack Overflow用户
提问于 2015-01-14 19:02:43
回答 2查看 731关注 0票数 1

有没有办法通过指向基类的指针来复制派生类对象?或者如何创建这样的复制构造函数?

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Base { 
public: Base( int x ) : x( x ) {}
private: int x;
};

class Derived1 : public Base { 
public: 
Derived( int z, float f ) : Base( z ), f( f ) {}
private: 
float f;
};

class Derived2 : public Base {
public: 
Derived( int z, string f ) : Base( z ), f( f ) {}
private: 
string f;
};

void main()
{ 
Base * A = new *Base[2];
Base * B = new *Base[2];
A[0] = new Derived1(5,7);
A[1] = new Derived2(5,"Hello");
B[0] = Base(*A[0]);
B[1] = Base(*A[1]);
}

问题是*B是不是Derived1对象,*B1是Derived2对象?如果没有,我如何通过指向基类的指针来复制派生类?是否有通过基类或派生类构建复制构造函数的特定方法?对于这个例子,默认的复制构造函数足够好吗?

EN

回答 2

Stack Overflow用户

发布于 2015-01-14 19:05:41

您可以为此提供虚拟方法Clone

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Base { 
public:
    Base(int x) : x(x) {}
    virtual ~Base() {}
    virtual Base* Clone() const { return new Base(*this); }
private:
    int x;
};

class Derived1 : public Base { 
public: 
    Derived1(int z, float f) : Base(z), f(f) {}
    virtual Derived1* Clone() const { return new Derived1(*this); }
private: 
    float f;
};

class Derived2 : public Base {
public: 
    Derived2(int z, std::string f) : Base(z), f(f) {}
    virtual Derived2* Clone() const { return new Derived2(*this); }
private: 
    std::string f;
};
票数 5
EN

Stack Overflow用户

发布于 2015-01-14 19:27:45

main的第二行(除了拼写错误之外),您构造了类Base的两个实例,然后您会问,在最后两行中,这些对象是否会以某种方式动态变形并成为派生类的实例。这当然是不可能的。

另外,检查这个answer

注释:我只是对您提供的代码和用例进行评论。使用虚拟Clone函数是复制多态对象的正确设计。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27950526

复制
相关文章
MSVC std::any 源码解析
std::any 是 c++17 标准新提供的类,作用是存储任意类型的一段内存,并可以重复赋值,在赋值后可以使用 std::any_cast 将 std::any 所存储的值转换成特定类型,如果 std::any 中存储的值的类型与目标类型不匹配,则会抛出 std::bad_any_cast 异常。
Kindem
2022/08/12
1.4K0
MSVC std::unique_ptr 源码解析
std::unique_ptr 是 c++ 11 添加的智能指针之一,是裸指针的封装,我们可以直接使用裸指针来构造 std::unique_ptr:
Kindem
2022/08/12
1.6K0
std::getline错误
vs低版本转高版本,std::getline报错,如下 提示 error C2027: 使用了未定义类型“std::basic_istream<char,std::char_traits> 找了istream转string的其他方法,折腾了很久才发现缺少 #include <sstream> 加上就好了
sofu456
2022/03/07
5510
std::getline错误
std::vector初始化[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/29
1.4K0
msvc交叉编译:使用vcvarsall.bat设置命令行编译环境
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/51722353
10km
2019/05/25
2.8K0
诡异!std::bind in std::bind 编译失败
当时看了报错,简单的以为跟之前遇到的原因一样,随即提出了解决方案,怎奈,短短几分钟,就被无情打脸,啪啪啪😭。为了我那仅存的一点点自尊,赶紧看下原因,顺便把之前的问题也回顾下。
高性能架构探索
2023/06/13
7890
诡异!std::bind in std::bind 编译失败
C++ std::isnan等函数的使用
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
ccf19881030
2019/10/22
7.1K0
undefined reference to `std::cout'等错误 undefined reference to `std::cout'等错误
(2)后缀名为.c的程序和.cpp的程序g++都会当成是c++的源程序来处理。而gcc不然,gcc会把.c的程序处理成c程序。
landv
2021/02/04
2.2K0
std::ref函数
       C++11 的std::ref函数就是为了解决在线程的创建中等过程的值拷贝问题,下面将会用一个线程的创建来展示ref函数的作用。
Ch_Zaqdt
2020/02/14
3.5K0
msvc:BAT脚本判断是否设置MSVC编译的环境变量(执行vcvarsall.bat)
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/79998773
10km
2019/05/25
1.6K0
GCC编译器的-std选项
GCC支持在编译的时候使用-std选项来选择编译语言的标准。程序本身也是在发展的,不断变化的。以 C 语言为例,发展至今该编程语言已经迭代了诸多个版本,例如 C89(偶尔又称为 C90)、C94(C89 的修订版)、C99、C11。同样,C++语言也经历了很多的标准变化,例如C++11,C++14,以及现在最新的C++20。既然语言都发展了这么多的标准,GCC编译器当然也要提供一个标准开关,他就是-std选项。对于编译 C、C++ 程序来说,借助 -std 选项即可手动控制 GCC 编译程序时所使用的编译标准。
zy010101
2020/12/01
2.7K0
GCC编译器的-std选项
msvc2013编译qt5.6源码
    说起到qt的编译,真是领人痛心啊,不仅编译选项繁多,而且编译时间比较久,总是能使想编译qt源码的人望而却步,呵呵。。。我就是其中一个,不知道从什么时候开始就想着把qt的源码编译一下,也尝试过几次,但都以失败而告终,编译的时候总是不得要领,网上的相关文章也是一大片,但总是五花八门,因为不同人的机器是不一样的,编译的源码时可能会出现不一样的错误信息。最近偶然间看到qtcn博客中有人用vs2013编译qt5.6,他也给出了编译的博客地址Qt 5.6.0 动态编译(VS2013 x86 target xp openssl icu webkit) ,我顿时又来了兴趣,兴致勃勃的去到这个地址阅读了作者的编译步骤,开始了新的编译里程。
用户3519280
2023/07/06
3720
msvc2013编译qt5.6源码
Windows 10下vscode使用visual studio 2017的MSVC配置C/C++编译环境
自己的Windows10系统下安装了VS2017,有时候不想每次为了编译和运行简单的C++程序都要打开消耗内存的VSCode,直接使用Visual Studio Code编译和运行C++程序,可以参考Windows 10下vscode使用visual studio 2017的MSVC配置C/C++编译环境这篇博客,微软vscode的官方文档“Configure VS Code for Microsoft C++”,使用visual studio自带的编译器来配置C/C++的编译环境
ccf19881030
2020/10/26
2.1K0
如何优雅的使用 std::variant 与 std::optional
std::variant与std::optional是c++17加入的新容器,variant主要是为了提供更安全的union, 而optional除了存取T类型本身外, 还提供了一个额外的表达optional是否被设置值的状态.
fangfang
2021/10/29
3.8K0
cmake: 使用jom实现msvc工程并发编译提高速度(-j)
摘要总结:本文介绍了cmake编译器中jom的使用方式,包括获取jom、使用cmake生成jom的Makefile、使用jom编译等步骤。通过使用jom,可以大大提高大型项目的编译速度,提高开发效率。
10km
2018/01/03
2.9K0
cmake:解决MSVC下/MT 编译paho.mqtt.c的问题
paho.mqtt.c是eclipse开发的C语言跨平台mqtt client 开源库,之前写过一篇博客《cmake:VS2015和GCC编译paho.mqtt C/C++ client》介绍如何编译它。 最近在使用的时候发现有个问题:paho.mqtt.c在MSVC编译的时候不能支持/MT编译。
10km
2022/04/13
8080
std::function与std::bind使用总结
C++中函数指针的用途非常广泛,例如回调函数,接口类的设计等,但函数指针始终不太灵活,它只能指向全局或静态函数,对于类成员函数、lambda表达式或其他可调用对象就无能为力了,因此,C++11推出了std::function与std::bind这两件大杀器。
forrestlin
2019/07/29
11.4K0
std库sort排序函数的crash
Qt4 to Qt5 - Obsolete Members for <QtAlgorithms>
mariolu
2023/05/26
5200
为什么直接使用 using namespace std 是个坏习惯
有人告诉我在代码里直接使用using namespace std;这样很不好,应该这么用,std::cout、std::cin等等。
ClearSeve
2022/02/10
3370
近期cmake-toolset的一些适配问题
偷懒了好久没有写分享了,最近的时间也是花费了很多时间大量优化了之前游戏服务器框架和组件的很多细节。其中,相对独立且同时也被其他的项目使用的一个工具则是基于 cmake 和 git 且兼容 vcpkg 的构建系统 cmake-toolset 。之所以要写这么个构建工具主要是要提供比 vcpkg 更宽容的兼容性(没办法我们公司的编译环境比较古老),并且提供更进一步的定制化能力(包含但不限于功能开关和下载源,这些东西 vcpkg 也是很后期才有了个初步的支持)。那么先来记录一下构建系统适配过程中的一些问题吧。
owent
2023/03/06
9530

相似问题

为什么MSVC不能编译这个模板函数?

14

MSVC std::isfinite编译问题

15

为什么MSVC不能编译这个CRTP代码?

12

为什么MSVC不初始化这个结构?

12

值模板方法的std::函数使用clang和g++编译,但不使用msvc编译

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文