是否可以在抽象时使用父类

时间:2015-03-10 16:23:38

标签: c++ abstract-class

我正在使用capd库(http://capd.ii.uj.edu.pl/),我有两段代码:

C0Rect2Set set(ex.start);
timeMap(ex.time, set); 

C0HOTripletonSet set(ex.start);
timeMap(ex.time, set);

我想抽象出C0Rect2SetC0HOTripletonSet的类型。我认为C0Rect2SetC0HOTripletonSet都来自C0Set(我对此不确定,但如果我尝试调用timeMap,则会在错误中提及该类使用无效类型的参数。)

如果我尝试使用C0Set作为类型

C0Rect2Set set(ex.start);
C0Set v = set2;

然后我收到以下错误:

ODEs.cpp:136:9: error: cannot declare variable ‘v’ to be of abstract type ‘capd::dynset::C0Set<capd::vectalg::Matrix<capd::filib::Interval<double, (filib::rounding_strategy)1u, (filib::interval_mode)0u>, 0u, 0u> >’
  C0Set v = set2;

我也试过使用指针:

C0Set *v = &set2;
IVector i = timeMap(ex.time, *v);

但后来我收到了错误:

terminate called after throwing an instance of 'std::logic_error'
  what():  C0HOSet: cannot move HO-type sets via abstract C0DynSys.

一件重要的事情是timeMap函数的行为取决于参数的类。

我不是c ++的专家,这是否可能我想做什么(统一这两种类型)?

2 个答案:

答案 0 :(得分:0)

问题:

  

是否可以在抽象时使用父类。

答案:

无法创建父类的实例。但是,只要指针指向具体子类的实例并且引用引用具体子类的实例,就可以创建指向父类和父类引用的指针。

这是一个什么是好的,什么不好的样本。

struct Base
{
   virtual ~Base() = 0;
   virtual void foo() = 0;
};

struct Derived1 : Base
{
   virtual ~Derived1(){}
   virtual void foo() {std::cout << "In Derived1::foo()\n";}
};

struct Derived2 : Base
{
   virtual ~Derived2(){}
   virtual void foo() {std::cout << "In Derived2::foo()\n";}
};

Base b1;                      // Not OK
Base* bPtr1 = new Derived1;   // OK

Dervied1 d1;
Base b2 = d1;                 // Not OK
Base* bPtr2 = &d1;            // OK

Dervied2 d2;
Base& bRef1 = d2;            // OK

答案 1 :(得分:0)

从广义上讲,您可以在抽象父类上调用非虚方法。

但是,在这种情况下,您的std::logic_error被提升了,因为capd库并不希望您做您正在做的事情,所以错误并不是特别关于您可以做什么或者不能用C ++做。