抽象时是否可以使用父类

Is it possible to use parentclass when it's abstract

我正在使用 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 派生的(我不确定这一点,但是如果我尝试调用 class ,错误中会提到 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 函数的行为取决于参数的 class。

我不是 C++ 专家,这甚至可能是我想做的(统一这两种类型)吗?

问题:

Is it possible to use parent class when it's abstract.

答案:

无法创建 parent class 的实例。但是,您可以创建指向 parent class 的指针和 parent class 的引用,只要这些指针指向具体 child class 并且引用引用了具体的实例 child class.

以下是可以和不可以的示例。

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

广义上,您可以在抽象父对象上调用非虚拟方法 class。

然而,在这种情况下,你的 std::logic_error 被引发是因为 capd 库不希望你做你正在做的事情,所以这个错误并不是关于你能做什么或不能做什么'在 C++ 中不做。