是不是可以使用间接(取消引用)运算符取消引用指向存储在数组中的对象的指针,还是我做错了什么?
#include <iostream>
class A {
public:
virtual void test() {
std::cout << "A\n";
}
};
class B : public A {
public:
void test() {
std::cout << "B\n";
}
};
int main() {
A* v[2];
v[0] = new A();
v[1] = new B();
v[0]->test();
*(v[1]).test(); // Error! If the arrow operator is used instead
// though, the code compiles without a problem.
return 0;
}
这是我得到的错误:
$ g++ -std=c++11 test.cpp && ./a.out
test.cpp: In function ‘int main()’:
test.cpp:26:13: error: request for member ‘test’ in ‘v[1]’, which is of
pointer type ‘A*’ (maybe you meant to use ‘->’ ?)
*(v[1]).test();
答案 0 :(得分:32)
根据Operator Precedence,operator.
(成员访问运算符)的优先级高于operator*
(间接/解除引用运算符),因此*(v[1]).test();
等效于{{1} ,这是无效的。 (您无法通过*((v[1]).test());
在test()
v[1]
上致电A*
。)
将其更改为
opeartor.
答案 1 :(得分:17)
正确的方法是:
(*v[1]).test();
这里首先索引数组并获取指针(v[1]
),然后取消引用指针(*v[1]
),最后按对象值调用方法。
在您的示例中,您首先尝试使用test
上的.
来调用v[1]
,这是一个指针。然后才取消引用方法的返回值,这也是无意义的,因为test
返回void。