h**********y 发帖数: 1293 | 1 下面这段code为什么是输出1413。。最后一个为什么是3
#include
#include
class A
{
public:
A(int n = 0) : m_n(n) { }
public:
virtual int f() const { return m_n; }
virtual ~A() { }
protected:
int m_n;
};
class B
: public A
{
public:
B(int n = 0) : A(n) { }
public:
virtual int f() const { return m_n + 1; }
};
int main()
{
const A a(1);
const B b(3);
const A *x[2] = { &a, &b };
typedef std::vector V;
V y({ a, b });
V::const_iterator i = y.begin();
std::cout << x[0]->f() << x[1]->f()
<< i->f() << (i + 1)->f() << std::endl;
return 0;
} |
q****m 发帖数: 177 | 2 polymophism 只能通过指针或者引用
【在 h**********y 的大作中提到】 : 下面这段code为什么是输出1413。。最后一个为什么是3 : #include : #include : class A : { : public: : A(int n = 0) : m_n(n) { } : public: : virtual int f() const { return m_n; } : virtual ~A() { }
|
h**********y 发帖数: 1293 | 3 iterator不也是包装好的指针么
【在 q****m 的大作中提到】 : polymophism 只能通过指针或者引用
|
d****n 发帖数: 12461 | 4 其实建vector用了copy ctor。
【在 h**********y 的大作中提到】 : iterator不也是包装好的指针么
|
p********4 发帖数: 58 | 5 我的理解,应该在vector中放地址,而不是object本身。这样才能实现多态。你原来的
做法,你的y中都是 class A. 不知道我的理解对不对。
int main()
{
const A a(1);
const B b(3);
const A *x[2] = { &a, &b };
typedef std::vector V;
V y({ &a, &b });
std::cout << x[0]->f() << x[1]->f() << std::endl;
for (auto i : y)
{
std::cout << i->f();
}
std::cout << std::endl;
return 0;
}
output:
14
14
【在 h**********y 的大作中提到】 : 下面这段code为什么是输出1413。。最后一个为什么是3 : #include : #include : class A : { : public: : A(int n = 0) : m_n(n) { } : public: : virtual int f() const { return m_n; } : virtual ~A() { }
|
w********s 发帖数: 1570 | 6 vector插入的时候把B copy了一下
copy以后,m_n是3,对象是A, 所以是3
【在 h**********y 的大作中提到】 : 下面这段code为什么是输出1413。。最后一个为什么是3 : #include : #include : class A : { : public: : A(int n = 0) : m_n(n) { } : public: : virtual int f() const { return m_n; } : virtual ~A() { }
|
w********s 发帖数: 1570 | 7 *i的类型是A,不是A*,所以调用的是A的f()
【在 h**********y 的大作中提到】 : 下面这段code为什么是输出1413。。最后一个为什么是3 : #include : #include : class A : { : public: : A(int n = 0) : m_n(n) { } : public: : virtual int f() const { return m_n; } : virtual ~A() { }
|
z*******5 发帖数: 30 | 8 this is an object slicing problem.
pzlife2014 的解释是对的。
【在 p********4 的大作中提到】 : 我的理解,应该在vector中放地址,而不是object本身。这样才能实现多态。你原来的 : 做法,你的y中都是 class A. 不知道我的理解对不对。 : int main() : { : const A a(1); : const B b(3); : const A *x[2] = { &a, &b }; : typedef std::vector V; : V y({ &a, &b }); : std::cout << x[0]->f() << x[1]->f() << std::endl;
|
l**********g 发帖数: 503 | 9 +1
【在 w********s 的大作中提到】 : *i的类型是A,不是A*,所以调用的是A的f()
|