如何在c++中实现子类与父类的可互换
How to make child class interchangeable with parent class in C++?
我正在尝试做一个c++练习,它由一个测试代码(main.cpp)和一个头文件(vcvec.h)组成。测试代码应该保持不变,而包含的头文件应该满足测试代码(这是我必须从头开始编写的)。
在本练习中,我必须通过继承来编写std::vector的扩展。我设法解决了这个练习的大部分问题,现在,我将只在下面附上代码的相关部分。main.cpp(测试代码)
#include <string>
#include "vcvec.h"
int main()
{
version_controlled_vector<unsigned int> v;
version_controlled_vector<std::string> a;
v.push_back( 1 );
a.push_back("C++");
std::vector<std::vector<std::string> > hista = a;
std::vector<std::vector<int> > histv = v;
}
vcvec.h
#ifndef VCVEC_H
#define VCVEC_H
#include <vector>
template<class T>
class version_controlled_vector : public std::vector<T>
{
private:
std::vector<std::vector<T>> history;
};
#endif // VCVEC_H
此代码生成以下编译错误:
main.cpp: In function ‘int main()’:
main.cpp:12:52: error: conversion from ‘version_controlled_vector<std::basic_string<char> >’ to non-scalar type ‘std::vector<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > >, std::allocator<std::vector<std::basic_string<char>, std::allocator<std::basic_string<char> > > > >’ requested
std::vector<std::vector<std::string> > hista = a;
^
main.cpp:13:44: error: conversion from ‘version_controlled_vector<unsigned int>’ to non-scalar type ‘std::vector<std::vector<int> >’ requested
std::vector<std::vector<int> > histv = v;
^
如何将version_controlled_vector的实例分配给std::vector类型?我能想到的唯一解决方案是一个合适的复制构造函数,但它应该发生在std::vector类中,所以它不是一个选项。
这些是我能想到的选项:
-
提供一个返回私有数据引用的函数
template<class T> class version_controlled_vector : public std::vector<T> { std::vector<std::vector<T>> const& getHistory() {return history;} const private: std::vector<std::vector<T>> history; };
然后,在客户端代码中使用:
std::vector<std::vector<std::string> > hista = a.getHistory();
-
提供自动强制转换操作符函数
template<class T> class version_controlled_vector : public std::vector<T> { public: operator std::vector<std::vector<T>> const& () {return history;} const private: std::vector<std::vector<T>> history; };
然后,在客户端代码中使用:
std::vector<std::vector<std::string> > hista = a;
-
将数据设置为
public
,以便其他人可以直接使用(不推荐)std::vector<std::vector<std::string> > hista = a.history;
更新,回应OP
我不知道你的文件看起来像什么,但是下面的代码,当把一个。cc文件,为我编译和构建。
#include <vector>
template<class T>
class version_controlled_vector : public std::vector<T>
{
public:
operator std::vector<std::vector<T> > const& () {return history;}
private:
std::vector<std::vector<T> > history;
};
#include <string>
int main()
{
version_controlled_vector<unsigned int> v;
version_controlled_vector<std::string> a;
v.push_back( 1 );
a.push_back("C++");
std::vector<std::vector<std::string> > hista = a;
std::vector<std::vector<unsigned int> > histv = v;
}
相关文章:
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 在运行时选择父类的实现
- 如何在C++子类中访问父类的私有变量
- 将父类的子类的数据复制到具有相同父类的另一个类
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- C++ 将子类的对象添加到父类的向量中
- 两个父类的构造函数的序列
- 为什么我的子类不继承父类的字符串?
- C++调用使用重写函数的父类函数
- 在父类中公开受保护的构造函数
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 如何使父类不重复已经执行的祖父方法
- 从模板化父类中的派生内部类访问受保护的成员变量
- Arduino在子类中使用父类方法
- 通过将父类强制转换为对子类的引用来提供类的可迭代"views"
- 仅通过指针强制转换使类类型可互换,而无需分配任何新对象
- 如何在c++中实现子类与父类的可互换