如何在c++中实现子类与父类的可互换

How to make child class interchangeable with parent class in C++?

本文关键字:父类 可互换 子类 实现 c++      更新时间:2023-10-16

我正在尝试做一个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类中,所以它不是一个选项。

这些是我能想到的选项:

  1. 提供一个返回私有数据引用的函数

    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();
    
  2. 提供自动强制转换操作符函数

    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;
    
  3. 将数据设置为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;
}