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<int,int> b = Base<int,int>();
Derived<double,double> d = Derived<double,double>();
DDerived dd = DDerived();
Ptr<double,double> p(&dd);
DDerived * fauxpointer;
fauxpointer = (DDerived\*) &(*p);
fauxpointer->DerivedMethod();
return 1;
}
讨厌。但它是有效的,这才是最重要的
向所有向我重复这个问题的人欢呼。好的。在尝试了大约10种不同的方法(static_-cast
,reinterpret_-cast
等)之后,您可以直接进行强制转换
int main()
{
Base<int,int> b = Base<int,int>();
Derived<double,double> d = Derived<double,double>();
DDerived dd = DDerived();
Ptr<double,double> p(&dd);
DDerived * fauxpointer;
fauxpointer = (DDerived\*) &(*p);
fauxpointer->DerivedMethod();
return 1;
}
讨厌。但它是有效的,这才是最重要的
向所有向我重复这个问题的人欢呼。你不能在这里使用dyanmic\u cast
!该类没有虚拟成员,因此没有运行时类型信息!你说得对,我没抓住那一点。编辑了我原来的帖子——谢谢。这段代码中缺少大量的方法,命名这些方法只是为了帮助理解。它们都有析构函数。如果它们都有析构函数,那么如果你还没有这样做的话,那么声明它们为虚拟的是非常必要的!啊哼。无关的这是示例代码。我不是在问我的编码风格,我知道我在做什么,一般来说。我要求的是一种做我上面演示的事情的方法。你不能在这里使用dyanmic\u cast
!该类没有虚拟成员,因此没有运行时类型信息!你说得对,我没抓住那一点。编辑了我原来的帖子——谢谢。这段代码中缺少大量的方法,命名这些方法只是为了帮助理解。它们都有析构函数。如果它们都有析构函数,那么如果你还没有这样做的话,那么声明它们为虚拟的是非常必要的!啊哼。无关的这是示例代码。我不是在问我的编码风格,我知道我在做什么,一般来说。我所要求的是一种做我上面演示的事情的方法。