抽象时是否可以使用父类
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);
我想对 C0Rect2Set
和 C0HOTripletonSet
的类型进行抽象。我认为 C0Rect2Set
和 C0HOTripletonSet
都是从 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++ 中不做。
我正在使用 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
派生的(我不确定这一点,但是如果我尝试调用 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++ 中不做。