具有迭代器和继承的 STL 容器
STL Container with iterator and inheritance
这是一个示例 C++ 问题,用于找出结果。
#include <iostream>
#include <vector>
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<A> 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;
}
我预期的输出是“1 4 1 4”,但正确答案是“1 4 1 3”。
从上面,
x[0]->f()
即,x[0] 只不过是一个指向 A 类型对象并调用 f() returns 1.
的指针
x[1]->f()
即,x[1] 只不过是一个指向类型 A 的对象的指针(基 class 指针指向派生的 class 对象)并调用派生的 class f( ) 那 returns (3 + 1) = 4
我不确定当我们将对象 a 和 b 添加到向量容器中并通过 const_iterator 继承
迭代它们时它的行为如何
i->f()
我可以理解这一点,因为 i 只是指向第一个元素的指针,即对象 a。
但是这里会发生什么呢?
(i + 1)->f()
我的理解是它指向序列中的下一个元素,即对象 b 并通过派生的 class 指针调用 f() 应该调用其成员函数而不是基 class 的成员函数?
矢量 y
包含两个 A
类型的对象。不输入 B
。构造时,它会复制 a
和 b
、slicing b
。因此 (i + 1)->f()
在 b
的 A
部分的副本上调用 A::f()
,给出 3.
这是一个示例 C++ 问题,用于找出结果。
#include <iostream>
#include <vector>
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<A> 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;
}
我预期的输出是“1 4 1 4”,但正确答案是“1 4 1 3”。
从上面,
x[0]->f()
即,x[0] 只不过是一个指向 A 类型对象并调用 f() returns 1.
的指针x[1]->f()
即,x[1] 只不过是一个指向类型 A 的对象的指针(基 class 指针指向派生的 class 对象)并调用派生的 class f( ) 那 returns (3 + 1) = 4
我不确定当我们将对象 a 和 b 添加到向量容器中并通过 const_iterator 继承
迭代它们时它的行为如何i->f()
我可以理解这一点,因为 i 只是指向第一个元素的指针,即对象 a。
但是这里会发生什么呢?
(i + 1)->f()
我的理解是它指向序列中的下一个元素,即对象 b 并通过派生的 class 指针调用 f() 应该调用其成员函数而不是基 class 的成员函数?
矢量 y
包含两个 A
类型的对象。不输入 B
。构造时,它会复制 a
和 b
、slicing b
。因此 (i + 1)->f()
在 b
的 A
部分的副本上调用 A::f()
,给出 3.