C++ 模板类的继承问题

C++ 模板类的继承问题,c++,inheritance,C++,Inheritance,有人能想出一个好办法让下面的代码工作吗?(这也是一种非常简单的方法) 模板类Ptr 类RealBase { }; 模板 类库:公共RealBase { 公众: Base(){}; }; 模板 派生类:公共基 { 公众: 派生(){}; void DerivedMethod(){}; }; 模板 类Ptr { 公众: Ptr(){}; Ptr(Base*a){in=a;}; 基本*运算符->() { 返回; }; 私人: 基*in; }; typedef派生数据驱动 int main() { B

有人能想出一个好办法让下面的代码工作吗?(这也是一种非常简单的方法)

模板类Ptr

类RealBase { };

模板 类库:公共RealBase { 公众: Base(){}; };

模板 派生类:公共基 { 公众: 派生(){}; void DerivedMethod(){}; }; 模板 类Ptr { 公众: Ptr(){}; Ptr(Base*a){in=a;}; 基本*运算符->() { 返回; }; 私人: 基*in; };

typedef派生数据驱动

int main() { Base b=Base(); 派生d=派生(); D驱动dd=D驱动(); Ptr pⅆ p->DerivedMethod(); 返回1; }

此时,编译器发出呻吟,因为基没有DerivedMethod()

编辑

我确实理解这里的问题,我的缺点是在第一个案例中缺乏解释(我当时很匆忙)。[顺便说一句,这是非常精简的代码,因此,是的,为了简单起见,我没有实际执行任何操作的析构函数或方法。忽略这一点,这对问题没有影响。]

我需要做的是,一个只处理派生类(D_-derived)的迭代器(这里没有详细说明)需要访问一个包含在派生类中而不是基类中的方法。简单地将这个方法链接到基类中并不是一个真正的选项,因为如果我必须这样做的话,这个错误会经常发生。(大约有10个类建立在真正的基类之上,它们都有自己的派生方法,比如20个,每个都有。)


有人能想出其他方法来实现此功能吗?

这很有意义。Base没有这样的方法(DerivedMethod)。如果DerivedMethod是基类的一个虚拟函数(可以是
),那么它就可以工作。

这是有道理的。Base没有这样的方法(DerivedMethod)。如果DerivedMethod是基类的一个虚拟函数(可以是
),它就会工作。

此代码不工作,因为模板类Ptr返回的是基类模板类的对象,而不是派生模板类的对象。派生方法是派生模板的一部分,因此会引发编译错误。然而,如果DerivedMethod是基础模板的一部分,则此代码将起作用

此代码不起作用,因为模板类Ptr返回的是基础模板类的对象,而不是派生模板类的对象。派生方法是派生模板的一部分,因此会引发编译错误。然而,如果DerivedMethod是基本模板的一部分,那么这段代码可以工作,编译器是正确的。为了能够访问方法,必须以编译器看到的类型(称为变量的静态类型)声明此方法。在您的例子中,此类型是
Base
,编译器不知道它是其他类型。

编译器是正确的。为了能够访问方法,必须以编译器看到的类型(称为变量的静态类型)声明此方法。在您的例子中,这种类型是
Base
,编译器不知道它是其他类型。

使用您的抽象类和成员名,很难确定您真正想要实现什么。如果确实必须将
Ptr
中的指针视为
D_派生的
,请向
Ptr
添加访问者成员并使用类型转换:

class Ptr {
    ...

    Base<f,g,Ptr<f,g> >* get() {
        return in;
    }
};

...

D_Derived* ptr = dynamic_cast<D_Derived*>(p.get());
if (ptr) {
    ptr->DerivedMethod();
}

使用抽象类和成员名很难弄清楚您真正想要实现什么。如果确实必须将
Ptr
中的指针视为
D_派生的
,请向
Ptr
添加访问者成员并使用类型转换:

class Ptr {
    ...

    Base<f,g,Ptr<f,g> >* get() {
        return in;
    }
};

...

D_Derived* ptr = dynamic_cast<D_Derived*>(p.get());
if (ptr) {
    ptr->DerivedMethod();
}

嗯。在尝试了大约10种不同的方法(
static_-cast
reinterpret_-cast
等)之后,您可以直接进行强制转换

int main()
{
    Base&lt;int,int> b = Base&lt;int,int>();
    Derived&lt;double,double> d = Derived&lt;double,double>();
    DDerived dd = DDerived();
    Ptr&lt;double,double> p(&dd);
    DDerived * fauxpointer;
    fauxpointer = (DDerived\*) &(*p);
    fauxpointer->DerivedMethod();
    return 1;
}
讨厌。但它是有效的,这才是最重要的


向所有向我重复这个问题的人欢呼。

好的。在尝试了大约10种不同的方法(
static_-cast
reinterpret_-cast
等)之后,您可以直接进行强制转换

int main()
{
    Base&lt;int,int> b = Base&lt;int,int>();
    Derived&lt;double,double> d = Derived&lt;double,double>();
    DDerived dd = DDerived();
    Ptr&lt;double,double> p(&dd);
    DDerived * fauxpointer;
    fauxpointer = (DDerived\*) &(*p);
    fauxpointer->DerivedMethod();
    return 1;
}
讨厌。但它是有效的,这才是最重要的


向所有向我重复这个问题的人欢呼。

你不能在这里使用
dyanmic\u cast
!该类没有虚拟成员,因此没有运行时类型信息!你说得对,我没抓住那一点。编辑了我原来的帖子——谢谢。这段代码中缺少大量的方法,命名这些方法只是为了帮助理解。它们都有析构函数。如果它们都有析构函数,那么如果你还没有这样做的话,那么声明它们为虚拟的是非常必要的!啊哼。无关的这是示例代码。我不是在问我的编码风格,我知道我在做什么,一般来说。我要求的是一种做我上面演示的事情的方法。你不能在这里使用
dyanmic\u cast
!该类没有虚拟成员,因此没有运行时类型信息!你说得对,我没抓住那一点。编辑了我原来的帖子——谢谢。这段代码中缺少大量的方法,命名这些方法只是为了帮助理解。它们都有析构函数。如果它们都有析构函数,那么如果你还没有这样做的话,那么声明它们为虚拟的是非常必要的!啊哼。无关的这是示例代码。我不是在问我的编码风格,我知道我在做什么,一般来说。我所要求的是一种做我上面演示的事情的方法。