适当调用派生 class
Call derived class appropriately
我有一个 class order
和两个派生的 classes:single_order
和 repeated_order
.
struct order{
string desc;
};
struct single_order : public order{
datetime dt;
};
struct repeated_order : public order{
datetime dt1;
datetime dt2;
};
我有一个 list<order*> ll
可以包含 single_order
和 repeated_order
以及两种方法:
bool is_expired(single_order &el){
if(today>el.dt){
//do something
}
}
bool is_expired(repeated_order &el){
if(today>el.dt1){
//do something
}
if(today>el.dt2){
//do something else
}
}
我想遍历 ll
并在每种情况下调用最合适的方法。 (两个函数的参数也可以不是引用)
怎么做?
您知道标记多态性,但您似乎对这个概念感到困惑。
这是一些代码:
#include <iostream>
#include <memory>
#include <vector>
class Base {
public:
Base() = default;
virtual ~Base() = default;
virtual void do_foo() = 0;
};
class Bar : public Base {
public:
Bar() = default;
void do_foo() override { std::cout << "From Bar\n"; }
};
class Baz : public Base {
public:
Baz() = default;
void do_foo() override { std::cout << "From BAZ\n"; }
};
int main() {
std::vector<std::unique_ptr<Base>> v;
v.emplace_back(new Bar());
v.emplace_back(new Baz());
for (const auto& i : v) {
i->do_foo();
}
}
你可以看到在Base
中有一个纯虚函数,virtual do_foo() = 0;
这意味着一些事情。 Base
是一个纯虚拟 class,您不能声明 Base
对象,只能声明指向 Base
的指针或引用。为了拥有一个具体的 class,或者您可以为其创建对象的对象,您需要重写那些纯虚函数。
您有一个函数希望能够在两种派生类型上调用。这是多态性如何让您的生活更轻松的完美示例。您可以看到每个派生的 class 都覆盖了纯虚函数并做自己的事情,然后我可以将两个派生类型存储在我的 main()
函数的向量中,并调用适当的函数每个对象。
输出:
❯ ./a.out
From Bar
From BAZ
我有一个 class order
和两个派生的 classes:single_order
和 repeated_order
.
struct order{
string desc;
};
struct single_order : public order{
datetime dt;
};
struct repeated_order : public order{
datetime dt1;
datetime dt2;
};
我有一个 list<order*> ll
可以包含 single_order
和 repeated_order
以及两种方法:
bool is_expired(single_order &el){
if(today>el.dt){
//do something
}
}
bool is_expired(repeated_order &el){
if(today>el.dt1){
//do something
}
if(today>el.dt2){
//do something else
}
}
我想遍历 ll
并在每种情况下调用最合适的方法。 (两个函数的参数也可以不是引用)
怎么做?
您知道标记多态性,但您似乎对这个概念感到困惑。 这是一些代码:
#include <iostream>
#include <memory>
#include <vector>
class Base {
public:
Base() = default;
virtual ~Base() = default;
virtual void do_foo() = 0;
};
class Bar : public Base {
public:
Bar() = default;
void do_foo() override { std::cout << "From Bar\n"; }
};
class Baz : public Base {
public:
Baz() = default;
void do_foo() override { std::cout << "From BAZ\n"; }
};
int main() {
std::vector<std::unique_ptr<Base>> v;
v.emplace_back(new Bar());
v.emplace_back(new Baz());
for (const auto& i : v) {
i->do_foo();
}
}
你可以看到在Base
中有一个纯虚函数,virtual do_foo() = 0;
这意味着一些事情。 Base
是一个纯虚拟 class,您不能声明 Base
对象,只能声明指向 Base
的指针或引用。为了拥有一个具体的 class,或者您可以为其创建对象的对象,您需要重写那些纯虚函数。
您有一个函数希望能够在两种派生类型上调用。这是多态性如何让您的生活更轻松的完美示例。您可以看到每个派生的 class 都覆盖了纯虚函数并做自己的事情,然后我可以将两个派生类型存储在我的 main()
函数的向量中,并调用适当的函数每个对象。
输出:
❯ ./a.out
From Bar
From BAZ