继承-C++,类模板作为基类派生及指针的问题。

问题描述

C++,类模板作为基类派生及指针的问题。
      **C++,类模板作为基类派生某几个类,可不可以定义指向基类的指针,然后通过这个指针来指向各个派生类?大家帮忙解答一下。我是初学者,勿喷啊!**            以下面例子为例。C++的。

    #include<iostream>
    using namespace std;
    template<class T1>
    class A
    {
     protected:
            T1 a;
     public:
           virtual void output1();
           virtual void input();
           virtual void output2();
      };

     template<class T1>
     void A<T1>::output1()
     {
           cout<<"输入a:"<<endl;
     }

    template<class T1>
    void A<T1>::input()
     {
          cin>>a;
     }

    template<class T1>
    void A<T1>::output2()
     {
          cout<<a<<endl;
     }

     template<class T2>
      class B:virtual public A<T2>
       {
       };

      template<class T3>
     class C:virtual public A<T3>
       {
      };

    int main()
      {
        A<int> *pt;
        B<int> B1;
        C<double> C1;
        int choice;
      cout<<"chioce 1 or 2?"<<endl;
      cin>>choice;
      if(choice==1)
              pt=&B1;
      else
             pt=&C1;
      pt->output1();
      pt->input();
      pt->output2();
      return 0;
    }

--------------------Configuration: 38 - Win32 Debug--------------------
Compiling...
38.cpp
E:SoftDocumentC++3838.cpp(58) : error C2440: '=' : cannot convert from 'class C *' to 'class A *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
执行 cl.exe 时出错.

38.exe - 1 error(s), 0 warning(s)

解决方案

 C从A<T>派生,而不是从A派生,它们没有继承关系。

解决方案二:

你c是double类型,a是int类型。两者不y一致。

解决方案三:

不好意思,程序有个地方改正一下, A *pt;改为 A *pt;
我的目的是能使指针pt根据需要,灵活选择性的改变指向对象,如要使它指向B1时就能指向B1,要使它指向C1时就能指向C1。大家帮忙解答一下。

解决方案四:

搜一下,模版类之间是否存在继承关系,你的问题可能就会解决

时间: 2025-01-21 19:36:39

继承-C++,类模板作为基类派生及指针的问题。的相关文章

C++:派生类访问模板化基类(templatized base class)的命名

派生类继承模板化基类的成员函数, 默认是无法访问, 模板化基类的命名. 原因是模板的定制化有可能取消某些函数, 为了能在编译期检测出错误, 所以默认无法访问. 派生类访问模板化基类, 包含三种方法: 1. 调用基类函数时, 使用"this->", 指明调用的类, 是本类, 在编译时, 可以进行检查; 2. 使用using声明式, 可以把基类的函数引入派生类, 在编译时, 可以进行检查; 3. 使用显示修饰(explicit qualification), 不推荐, 显示修饰会屏蔽

C++箴言:如何访问模板化基类中的名字

假设我们要写一个应用程序,它可以把消息传送到几个不同的公司去.消息既可以以加密方式也可以以明文(不加密)的方式传送.如果我们有足够的信息在编译期间确定哪个消息将要发送给哪个公司,我们就可以用一个 template-based(模板基)来解决问题: class CompanyA {public: ... void sendCleartext(const std::string& msg); void sendEncrypted(const std::string& msg); ...};cl

派生类与派生类对象对基类成员的访问

区分"派生类对象"和"派生类"对基类成员的访问权限.    "派生类对象"对基类成员的访问权限:      (1)对于公有继承,只有基类的公有成员可以被"派生类对象"访问,其他(保护和私有)成员不能被访问.      (2)对于私有继承和保护继承,基类中所有成员都不能被"派生类对象"访问.    "派生类"对基类中成员的访问权限:     (1)对于公有继承,基类中的公有成员和保护成

在C++中 怎么在派生类中使用基类中的成员变量 例如如下代码 怎样才能使其跑起来

问题描述 在C++中 怎么在派生类中使用基类中的成员变量 例如如下代码 怎样才能使其跑起来 #include using namespace std; class love{ public: char you() { int i=87, j=74 ,k=89; char a=char(i),b=char(j),c=char(k); return 0; } }; class Me:private love{ public: Me():l(a),u(b),n(c){} char const l,u,

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

msdn-派生类存放在基类类型vector中,怎么用派生类的函数?

问题描述 派生类存放在基类类型vector中,怎么用派生类的函数? 我已经成功将派生类存放在基类类型的vector表中,也能定位位置,就是不知道怎么使用派生类的函数,只能用基类的函数,求解啊! #include#include#include#includeusing namespace std;class people{public: people() { name = new char[20]; code = 0; sex = new char[8]; number = new char[2

c++派生类怎样调用基类的操作符函数

问题描述 c++派生类怎样调用基类的操作符函数 派生类中怎样调用基类的输出操作符重载函数,想输出基类的私有成员,利用子类的对象 解决方案 a.base::operator ==(b); base::operator=(a,b); 可以这么调用

C# 类中隐藏基类方法和Partial

原文:C# 类中隐藏基类方法和Partial 今天对于.NET开发人员来说最开心的事情莫过于微软搞开源了,这觉得是给搞.NET开发的长脸.虽然我是一个初学者,这无疑给我极大的学习动力.Fighting!!! 当一个类从父类继承了一个成员时,也就继承了它的执行代码,如果成员时虚拟的,我们可以用override重写这段执行代码.但无论他是否是虚拟的,都可以通过new 关键字来隐藏它.例如: public class BaseClass { public void DoSomething() { //

编程-数组类模板Array,类中包括对数组进行排序、查找和求元素和 然后由此产生模板类Array&amp;amp;lt;Box&amp;amp;gt;

问题描述 数组类模板Array,类中包括对数组进行排序.查找和求元素和 然后由此产生模板类Array<Box> #include using namespace std;class Box{private: int a b c;public: int V; Box(int chint kint g) { a = ch; b = k; c = g; V = a*b*c; } bool operator <(Box &one) { int temp = V - one.V; if (