【发布时间】:2015-06-21 19:43:01
【问题描述】:
今天我尝试了一些东西,认为它不起作用,但它确实有效,我不明白为什么......
我有一个 base 类型的对象,它什么都不包含。
另一个derived类型,继承自base,存储一个函数指针并调用它。derived是一个模板对象,它的参数是存储的函数等待的参数的类型。
如果我从derived<void> 类型的对象中引用base 类型并尝试将其转换为derived<int>... 它确实有效。derived<>和derived< int >是两种不同的类型,你怎么解释?
一个简单的例子:
#include <iostream>
void foo( int ) { ::std::cout << "void foo( int )\n"; }
void foo() { ::std::cout << "void foo()\n"; }
struct base
{
base() { ::std::cout << "\tcreate base\n"; }
base( const base & ) { ::std::cout << "\tcopy base\n"; }
base( base && ) { ::std::cout << "\tmove base\n"; }
void operator =( const base & ) { ::std::cout << "\tcopy assignment base\n"; }
void operator =( base && ) { ::std::cout << "\tmove assignment base\n"; }
};
template < typename ... Args >
struct derived : public base
{
derived() { ::std::cout << "\tcreate derived\n"; }
derived( const derived & ) { ::std::cout << "\tcopy derived\n"; }
derived( derived && ) { ::std::cout << "\tmove derived\n"; }
derived & operator =( const derived & ) { ::std::cout << "\tcopy assignment derived\n"; }
derived & operator =( derived && ) { ::std::cout << "\tmove assignment derived\n"; }
void operator ()( Args ... args )
{
f( args ... );
}
void ( *f )( Args ... );
};
int main()
{
derived<> derived_void;
derived_void.f = ( void ( * )() )&foo;
base & base_void = derived_void;
derived<> &test = derived_void;
static_cast< derived< int > & >( base_void )( 1 ); // compiles, makes no copy
// static_cast< derived< int > & >( test )( 1 ); // doesn't compile
}
感谢您的帮助。
【问题讨论】:
标签: c++ templates inheritance casting