可能重复:
虚函数对象切片
让我们考虑一下:
#include <vector>
#include <iostream>
using namespace std;
struct A {
virtual void do_it() { cout << "A" << endl; }
};
struct B : public A {
virtual void do_it() { cout << "B" << endl; }
};
int main() {
vector<A> v;
v.push_back(B());
v[0].do_it(); // output is A
}
Run Code Online (Sandbox Code Playgroud)
哪个功能会被调用?如果不存在切片,基本上可以使用不带指针的多态性吗?
我有一个指向派生类对象的基类指针.我foo()在下面的代码中使用两种不同的方式调用函数.为什么Derived::foo()在第一种情况下被调用?不应该(*obj).foo()调用Base::foo()函数,因为它已被解除引用?
class Base
{
public:
Base() {}
virtual void foo() { std::cout << "Base::foo() called" << std::endl; }
virtual ~Base() {};
};
class Derived: public Base
{
public:
Derived() : Base() {}
virtual void foo() { std::cout << "Derived::foo() called" << std::endl; }
virtual ~Derived() {};
};
int main() {
Base* obj = new Derived();
// SCENARIO 1
(*obj).foo();
// SCENARIO 2
Base obj1 = *obj;
obj1.foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)