c++问题。关于调用类的对象成员的成员函数
就是说我定义了一个2各类classa{~~~~voidtest();};classb{aproblem;~~~};如何调用test函数?是b::problem.test吗...
就是说我定义了一个2各类
class a{~~~~
void test();
};
class b {
a problem;
~~~
};
如何调用 test 函数?
是b::problem.test 吗?
还有如果我的b类中 动态申请了 a类的对象
如何调用。
是b::problem【2】->test吗?、
我们是选修课 都叫自己看的,看了大半本 但是有点搞混了 展开
class a{~~~~
void test();
};
class b {
a problem;
~~~
};
如何调用 test 函数?
是b::problem.test 吗?
还有如果我的b类中 动态申请了 a类的对象
如何调用。
是b::problem【2】->test吗?、
我们是选修课 都叫自己看的,看了大半本 但是有点搞混了 展开
6个回答
展开全部
你的problem不是静态的不能通过类名调用,只能创建b类通过对象调用,而且a类的void
test()须是公有的.
#include
using
namespace
std;
class
A
{
public
:
void
test(){
cout<<"test
A";
}
static
void
stest(){
cout<<"static
test
A";
}
};
class
B
{
public:
void
test(){
a.test();
}
public
:
A
a;
static
A
sa;
};
int
main()
{
B
b;
b.test();
b.a.test();
B::sa.stest();
}
以上三种方法都正确,希望对你有用.
test()须是公有的.
#include
using
namespace
std;
class
A
{
public
:
void
test(){
cout<<"test
A";
}
static
void
stest(){
cout<<"static
test
A";
}
};
class
B
{
public:
void
test(){
a.test();
}
public
:
A
a;
static
A
sa;
};
int
main()
{
B
b;
b.test();
b.a.test();
B::sa.stest();
}
以上三种方法都正确,希望对你有用.
展开全部
成员函数编译以后就是普通的函数,
比如Base的Print被改名为void Print_Base_xxxxx(Base* pBase);
那b->Print被转为Print_Base_xxxxx(NULL);
其实更激烈点的方式,比如Derived继承于Base,它实现了Print这个函数。
你在main里面调用
Derived* pDerived = NULL;
pDerived->Print;
再做一个假设,你想crack这个编译后的可执行程序。
你找个反汇编工具,看到函数调用call ptr[derived_print_xxx]类似这样一条语句,把它改为call ptr[base_print_xxx].再运行程序,你会发现调用的是Base的Print。
所以说成员函数和普通的非成员函数没有本质的区别(起码编译以后是这样),调用的方法也是一样的。
3. 编译器实现问题楼主不必深究。如果有兴趣你可以去windws mobile资源区看看ansi c++ standard,看看里面有没有对这个的实现做出具体的规定。如果c++ standard没有具体规定,那么不同的c++厂商怎么实现自己定。
比如Base的Print被改名为void Print_Base_xxxxx(Base* pBase);
那b->Print被转为Print_Base_xxxxx(NULL);
其实更激烈点的方式,比如Derived继承于Base,它实现了Print这个函数。
你在main里面调用
Derived* pDerived = NULL;
pDerived->Print;
再做一个假设,你想crack这个编译后的可执行程序。
你找个反汇编工具,看到函数调用call ptr[derived_print_xxx]类似这样一条语句,把它改为call ptr[base_print_xxx].再运行程序,你会发现调用的是Base的Print。
所以说成员函数和普通的非成员函数没有本质的区别(起码编译以后是这样),调用的方法也是一样的。
3. 编译器实现问题楼主不必深究。如果有兴趣你可以去windws mobile资源区看看ansi c++ standard,看看里面有没有对这个的实现做出具体的规定。如果c++ standard没有具体规定,那么不同的c++厂商怎么实现自己定。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
类b中的problem成员默认是protected属性,不能通过b的对象调用成员a的方法test()。可以这样做:
class b {
public:
a problem;
...
};
b obj_b;
obj_b.problem.test();
class b {
public:
a problem;
...
};
b obj_b;
obj_b.problem.test();
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
a里的成员变量还有成员函数都是私有的,没有办法在类外访问。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的problem不是静态的不能通过类名调用,只能创建b类通过对象调用,而且a类的void test()须是公有的.
#include <iostream>
using namespace std;
class A {
public :
void test(){
cout<<"test A";
}
static void stest(){
cout<<"static test A";
}
};
class B {
public: void test(){
a.test();
}
public : A a;
static A sa;
};
int main()
{
B b;
b.test();
b.a.test();
B::sa.stest();
}
以上三种方法都正确,希望对你有用.
#include <iostream>
using namespace std;
class A {
public :
void test(){
cout<<"test A";
}
static void stest(){
cout<<"static test A";
}
};
class B {
public: void test(){
a.test();
}
public : A a;
static A sa;
};
int main()
{
B b;
b.test();
b.a.test();
B::sa.stest();
}
以上三种方法都正确,希望对你有用.
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询