我正在使用capd库(http://capd.ii.uj.edu.pl/),我有两段代码:
C0Rect2Set set(ex.start);
timeMap(ex.time, set);
和
C0HOTripletonSet set(ex.start);
timeMap(ex.time, set);
我想抽象出C0Rect2Set
和C0HOTripletonSet
的类型。我认为C0Rect2Set
和C0HOTripletonSet
都来自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 ++的专家,这是否可能我想做什么(统一这两种类型)?
答案 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 ++做。